{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "fILOgeyGIW3_"
      },
      "source": [
        "# Differentially Private Alternating Minimization\n",
        "\n",
        "Copyright 2023 The Google Research Authors.\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "you may not use this file except in compliance with the License.\n",
        "You may obtain a copy of the License at\n",
        "\n",
        "    http://www.apache.org/licenses/LICENSE-2.0\n",
        "\n",
        "Unless required by applicable law or agreed to in writing, software\n",
        "distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "See the License for the specific language governing permissions and\n",
        "limitations under the License."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "U80nvTwAzMjr"
      },
      "source": [
        "This colab accompanies the papers\n",
        "- [Private Alternating Least Squares](https://proceedings.mlr.press/v139/chien21a.html)\n",
        "- [Multi-Task Differential Privacy Under Distribution Skew](https://arxiv.org/abs/2302.07975)\n",
        "\n",
        "**Problem formulation**\n",
        "\n",
        "Let $M$ be a ratings matrix, where rows represent users and columns represent items. Let $U, V$ be the user and item embeddings, respectively. The goal is to approximate $M$ with the low-rank matrix $UV^\\top$. The loss function is\n",
        "\n",
        "$$\n",
        "L(U, V) = \\sum_{(i, j) \\in \\Omega} \\Big[(M_{ij} - \\langle u_i, v_j\\rangle)^2 + \\lambda(\\|u_i\\|^2 + \\|v_j\\|^2)\\Big] + \\alpha_0 \\sum_{i, j} \\langle u_i, v_j\\rangle^2\n",
        "$$\n",
        "where\n",
        "- $\\Omega$ is the set of \"observed\" pairs, i.e. the $(i, j)$ such that user $i$ has rated item $j$,\n",
        "- $\\alpha_0$ (unobserved weight) and $\\lambda$ (regularization) are two hyper-parameters.\n",
        "\n",
        "\n",
        "**Algorithms**\n",
        "\n",
        "1) Data sanitization\n",
        "\n",
        "The `Sanitizer` class is used to pre-process the data. All pre-processing operations are differentially private. Pre-processing includes:\n",
        "1. Center the data.\n",
        "2. Compute approximate item counts by subsampling each user (uniformly) and adding Gaussian noise.\n",
        "3. Limit the L2 sensitivity w.r.t. each user's data, either by sampling (as in the [DPALS paper](https://proceedings.mlr.press/v139/chien21a.html)) or by using adaptive budget allocation (as in the [DP Under Skew paper](https://arxiv.org/abs/2302.07975)).\n",
        "\n",
        "2) Training\n",
        "\n",
        "DP alternating minimization (DPAM) alternates between:\n",
        "1. Solving for the user embeddings $u_i$, using (exact) least squares\n",
        "2. Training the item embedding $v_j$. This is a DP linear regression problem and can be solved using different methods:\n",
        "  - In the `DPALSModel` class, this is done using sufficient statistics perturbation (SSP).\n",
        "  - In the `DPAMModel` class, this is done using noisy gradient methods (for example the `DPSparseKerasSGDOptimizer`)\n",
        "\n",
        "\n",
        "\n",
        "**Benchmarks**\n",
        "\n",
        "We use two benchmarks based on the [MovieLens](https://grouplens.org/datasets/movielens/) data.\n",
        "\n",
        "- The MovieLens20M benchmark is a classification task, and follows the protocol of [Liang et al. (2018)](https://dl.acm.org/doi/10.1145/3178876.3186150):\n",
        "  - The validation and test set each consist of new users, i.e. users not present in the train set.\n",
        "  - The ratings of each user are split into a \"history\" and target predictions (corresponding to `validation_tr` and `validation_te`, respectively).\n",
        "  - The protocol is to use `validation_tr` to compute a user embedding (via a one-step row solve), then use that embedding to compute predictions.\n",
        "  - For the purpose of computing recall, the \"history\" is excluded from the set of candidates, so that the model is not penalized for retrieving a positive item from the history.\n",
        "  - The same applies to the test set, which is split into `test_tr` and `test_te`.\n",
        "- The MovieLens10M benchmark is a regression task, and follows the protocol of [Lee et al. (2013)](https://dl.acm.org/doi/10.5555/2946645.2946660):\n",
        "  - The ratings are split into train/validation/test using a 80/10/10 split.\n",
        "\n",
        "The script `generate_movielens_data.py` (run in the second cell below) downloads and processes the MovieLens data following the protocols defined in the papers above."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "m1HESp8W8Oed"
      },
      "source": [
        "# Setup (run all cels in this section)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TcqP8gzd2yiC"
      },
      "outputs": [],
      "source": [
        "%%capture\n",
        "# Install dp_alternating_minimization (only download sub-tree of the\n",
        "# google-research repo, because it's too large)\n",
        "!apt-get install subversion\n",
        "!svn export https://github.com/google-research/google-research/trunk/dp_alternating_minimization\n",
        "!pip3 install -r dp_alternating_minimization/requirements.txt\n",
        "\n",
        "# Install tensorflow_privacy (dev version, for access to latest optimizers)\n",
        "!pip3 install git+https://github.com/tensorflow/privacy"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "gIk88zn6E6qy"
      },
      "outputs": [],
      "source": [
        "# Download and pre-process MovieLens data.\n",
        "!python dp_alternating_minimization/movielens/generate_movielens_data.py"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "Nl0-TKJCBNRo"
      },
      "outputs": [],
      "source": [
        "#@title Imports\n",
        "\n",
        "import tensorflow as tf\n",
        "\n",
        "import copy\n",
        "import time\n",
        "import os\n",
        "import gc\n",
        "import numpy as np\n",
        "import pandas as pd\n",
        "from IPython import display\n",
        "from matplotlib import pyplot as plt\n",
        "import sklearn.manifold\n",
        "import altair as alt\n",
        "\n",
        "from dp_alternating_minimization import dpam\n",
        "\n",
        "SparseMatrix = dpam.SparseMatrix\n",
        "Sanitizer = dpam.Sanitizer\n",
        "Dataset = dpam.Dataset\n",
        "DPALSModel = dpam.DPALSModel\n",
        "DPALSOptimizer = dpam.DPALSOptimizer\n",
        "DPALSAccountant = dpam.DPALSAccountant\n",
        "AMModel = dpam.AMModel\n",
        "DPAMAccountant = dpam.DPAMAccountant\n",
        "\n",
        "RMSE_METRICS = [[\"valid_RMSE\", \"test_RMSE\"],]\n",
        "RECALL_METRICS = [[\"valid_R@20\", \"test_R@20\"],]\n",
        "\n",
        "alt.data_transformers.enable('default', max_rows=None)\n",
        "alt.renderers.enable('colab')\n",
        "pd.options.display.max_rows = 20\n",
        "pd.options.display.float_format = '{:.3f}'.format\n",
        "%matplotlib inline"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "AuiCDdlpB1bm"
      },
      "outputs": [],
      "source": [
        "#@title Movielens data\n",
        "\n",
        "def load_data(basedir):\n",
        "\n",
        "  def shift_uid(matrix):\n",
        "    \"\"\"Shifts the uid so that it starts at 0.\"\"\"\n",
        "    min_uid = min(matrix.data.uid)\n",
        "    if matrix.history is not None:\n",
        "      min_uid = min(min_uid, min(matrix.history.uid))\n",
        "    matrix.data.uid = matrix.data.uid - min_uid\n",
        "    if matrix.history is not None:\n",
        "      matrix.history.uid = matrix.history.uid - min_uid\n",
        "\n",
        "  def exists(filename):\n",
        "    return tf.io.gfile.exists(os.path.join(basedir, filename))\n",
        "\n",
        "  def read_csv(filename, sort=True):\n",
        "    print(f'reading {filename}', flush=True)\n",
        "    df = pd.read_csv(tf.io.gfile.GFile(os.path.join(basedir, filename)))\n",
        "    if sort:\n",
        "      df = df.sort_values(['uid', 'sid'])\n",
        "    return df\n",
        "\n",
        "  t0 = time.time()\n",
        "  train_df = read_csv('train.csv')\n",
        "  train = SparseMatrix(train_df)\n",
        "  if exists('validation_tr.csv'):\n",
        "    validation = SparseMatrix(\n",
        "        read_csv('validation_te.csv'),\n",
        "        read_csv('validation_tr.csv'))\n",
        "    shift_uid(validation)\n",
        "  else:\n",
        "    # If there is no tr/te split, use training data for projection.\n",
        "    validation = SparseMatrix(\n",
        "        read_csv('validation.csv'), train_df)\n",
        "  if exists('test_tr.csv'):\n",
        "    test = SparseMatrix(\n",
        "        read_csv('test_te.csv'),\n",
        "        read_csv('test_tr.csv'))\n",
        "    shift_uid(test)\n",
        "  else:\n",
        "    # For the test set, use both train and validation for the projection.\n",
        "    test = SparseMatrix(read_csv('test.csv'), pd.concat([train_df, validation.data]))\n",
        "\n",
        "  print(f'Creating Dataset', flush=True)\n",
        "  # metadata\n",
        "  metadata = read_csv('features.csv', sort=False)\n",
        "  metadata['genres_ML'] = metadata.apply(lambda x: x['genres'].split('|'), axis = 1)\n",
        "  num_users = max([max(d.data[\"uid\"]) for d in (train, validation, test)]) + 1\n",
        "  num_items = max([max(d.data[\"sid\"]) for d in (train, validation, test)]) + 1\n",
        "  if num_items \u003c max(metadata[\"sid\"]) + 1:\n",
        "    num_items = max(metadata[\"sid\"]) + 1\n",
        "  dataset = Dataset(\n",
        "      num_users, num_items, metadata, train=train, validation=validation,\n",
        "      test=test)\n",
        "  print(f\"Done in {int(time.time() - t0)}s.\")\n",
        "  return dataset\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "cellView": "form",
        "id": "V_fMNMF1Ih3W"
      },
      "outputs": [],
      "source": [
        "#@title Plotting utils\n",
        "class Visualizer(object):\n",
        "\n",
        "  def __init__(self, model):\n",
        "    \"\"\"Initializes a Visualizer object.\n",
        "\n",
        "    Args:\n",
        "      model: an object that provides the following members: model.dataset,\n",
        "        model.embeddings and model.rmses.\n",
        "    \"\"\"\n",
        "    # Build a users_df and items_df for visualization.\n",
        "    dataset = model.dataset\n",
        "    num_users = dataset.test.num_users\n",
        "    num_items = dataset.num_items\n",
        "    users_df = pd.DataFrame.from_dict({\"uid\": range(num_users)})\n",
        "    users_df[\"title\"] = users_df[\"uid\"]\n",
        "    \n",
        "    # Use test users counts (to handle cold-start users), and train item counts.\n",
        "    users_df[\"num_ratings\"] = dataset.user_counts_test[users_df[\"uid\"]]\n",
        "    items_df = None\n",
        "    if dataset.metadata_df is not None:\n",
        "      items_df = dataset.metadata_df.copy()\n",
        "      items_df[\"num_ratings\"] = dataset.item_counts_train[items_df[\"sid\"]]\n",
        "      # For the purpose of visualization, select one genre per movie.\n",
        "      items_df[\"genres\"] = items_df[\"genres\"].apply(lambda x: np.random.choice(x.split(\"|\")))\n",
        "    self._users_df = users_df\n",
        "    self._items_df = items_df\n",
        "    self._model = model\n",
        "\n",
        "  def _scatter_plot(self, user, y_vals, y_label, density=False,\n",
        "                    xlogscale=False):\n",
        "    if user:\n",
        "      df = self._users_df\n",
        "      indices = df[\"uid\"]\n",
        "    else:\n",
        "      df = self._items_df\n",
        "      indices = df[\"sid\"]\n",
        "    df = pd.DataFrame({\n",
        "        'title': df['title'],\n",
        "        'num_ratings': df['num_ratings'],\n",
        "        y_label: y_vals[indices],\n",
        "    })\n",
        "    if xlogscale:\n",
        "      df['num_ratings'] = np.log(1+df['num_ratings'])\n",
        "    scatter_chart = (\n",
        "        alt.Chart(df)\n",
        "        .mark_point(opacity=0.5, size=5)\n",
        "        .encode(x=alt.X('num_ratings', title=\"#ratings\"),\n",
        "                y=alt.Y(y_label, title=y_label),\n",
        "                tooltip='title'))\n",
        "    def get_bin_step(key):\n",
        "      # Force the step to get exactly 30 bins.\n",
        "      min_val = df[key].min()\n",
        "      max_val = df[key].max()\n",
        "      return (max_val - min_val)/30\n",
        "    density_chart = alt.Chart(df).mark_rect().encode(\n",
        "          alt.X('num_ratings', bin=alt.Bin(step=get_bin_step(\"num_ratings\"))),\n",
        "          alt.Y(f'{y_label}', bin=alt.Bin(step=get_bin_step(y_label))),\n",
        "          alt.Color(f'count({y_label})',\n",
        "                    scale=alt.Scale(type=\"log\", scheme='yelloworangered')))\n",
        "    chart = alt.LayerChart()\n",
        "    if density:\n",
        "      chart += density_chart\n",
        "    else:\n",
        "      chart += scatter_chart\n",
        "    return chart\n",
        "\n",
        "  def scatter_user_embedding_norm(self, density=False, xlogscale=False):\n",
        "    return self._scatter_plot(\n",
        "        user=True, y_vals=np.linalg.norm(self._model.row_embeddings, axis=1),\n",
        "        y_label='embedding norm', density=density, xlogscale=xlogscale)\n",
        "\n",
        "  def scatter_item_embedding_norm(self, density=False, xlogscale=False):\n",
        "    return self._scatter_plot(\n",
        "        user=False, y_vals=np.linalg.norm(self._model.col_embeddings, axis=1),\n",
        "        y_label='embedding norm', density=density, xlogscale=xlogscale)\n",
        "\n",
        "  def nearest_neighbors(\n",
        "      self, title_substring, cosine=True, k=6, latex=False,\n",
        "      latex_cols=None):\n",
        "    # Search for item ids that match the given substring.\n",
        "    title_substring = title_substring.lower()\n",
        "    all_titles = self._items_df['title'].str.lower()\n",
        "    matches = self._items_df[all_titles.map(lambda x: title_substring in x)]\n",
        "    titles = matches['title'].values\n",
        "    if len(titles) == 0:\n",
        "      raise ValueError(\"Found no items with title %s\" % title_substring)\n",
        "    if len(titles) \u003e 1:\n",
        "      print(\"Note: Found more than one matching item. Other candidates:\\n{}\"\n",
        "            .format(\"\\n\".join(titles[1:])))\n",
        "    print(f\"Nearest neighbors of: {titles[0]} (sid: {matches['sid'].values[0]})\")\n",
        "    item_id = matches.sid.values[0]\n",
        "    V = self._model.col_embeddings.numpy()\n",
        "    if cosine:\n",
        "      V = V / np.maximum(1e-10, np.linalg.norm(V, axis=1, keepdims=True))\n",
        "    scores = V[item_id].dot(V.T)\n",
        "    score_key = 'cosine score' if cosine else 'dot score'\n",
        "    df = copy.copy(self._items_df)\n",
        "    df[score_key] = scores[df[\"sid\"]]\n",
        "    df = df.sort_values([score_key], ascending=False).head(k)\n",
        "    if latex:\n",
        "      # Add an empty column, so we may add empty column to the output table.\n",
        "      df[\"empty\"] = \"\"\n",
        "      if latex_cols:\n",
        "        latex_cols = [x or \"empty\" for x in latex_cols]\n",
        "        with pd.option_context(\"max_colwidth\", 1000):  # make sure we don't truncate any long column\n",
        "          print(df.to_latex(index=False, columns=latex_cols))\n",
        "    else:\n",
        "      display.display(df)\n",
        "\n",
        "  def tsne_embeddings(self, top=None, color_by='genres'):\n",
        "    \"\"\"Visualizes item embeddings, projected with t-SNE on cosine similarity.\"\"\"\n",
        "    known_keys = self._items_df.columns\n",
        "    if color_by not in known_keys:\n",
        "      raise ValueError(\n",
        "          f\"{color_by} is not recognized. Available features: {known_keys}\")\n",
        "    def visualize_item_embeddings(data, x, y):\n",
        "      feature_filter = alt.selection_multi(fields=[color_by])\n",
        "      off_color = alt.value('silver')\n",
        "      color = alt.condition(feature_filter, alt.Color(f\"{color_by}:N\"), off_color)\n",
        "      feature_chart = (\n",
        "          alt.Chart().mark_bar().encode(\n",
        "              x=\"count()\", y=alt.Y(color_by), color=color)\n",
        "          .properties(width=300, height=450)\n",
        "          .add_selection(feature_filter))\n",
        "      slider = alt.binding_range(\n",
        "          min=0, max=max(data[\"num_ratings\"]), step=1, name='num ratings ≥ ')\n",
        "      rating_selector = alt.selection_single(\n",
        "          fields=['cutoff'], bind=slider, init={'cutoff': 0})\n",
        "      rating_opacity = alt.condition(\n",
        "          alt.datum.num_ratings \u003c rating_selector.cutoff,\n",
        "          alt.value(0.02), alt.value(0.7))\n",
        "      base = (\n",
        "          alt.Chart()\n",
        "          .mark_circle()\n",
        "          .encode(x=x, y=y, tooltip=\"title\", color=color, opacity=rating_opacity)\n",
        "          .add_selection(rating_selector)\n",
        "          .properties(width=600, height=600)\n",
        "          .interactive())\n",
        "      return alt.hconcat(base, feature_chart, data=data)\n",
        "    def take_one(feature):\n",
        "      if isinstance(feature, list):\n",
        "        # For multi-valued features, we select one for visualization purposes.\n",
        "        return np.random.choice(feature)\n",
        "      return feature\n",
        "    data = self._items_df.copy().applymap(take_one)\n",
        "    indices = data['sid']\n",
        "    embeddings = self._model.col_embeddings.numpy()[indices]\n",
        "    if top:\n",
        "      # Only keep the top items (by number of ratings)\n",
        "      threshold = sorted(data[\"num_ratings\"], reverse=True)[top]\n",
        "      mask = data[\"num_ratings\"] \u003e= threshold\n",
        "      embeddings = embeddings[mask]\n",
        "      data = data[mask]\n",
        "    # Only keep non-zero embeddings\n",
        "    mask = np.linalg.norm(embeddings, axis=1) \u003e 0\n",
        "    num_zeros = embeddings.shape[0] - sum(mask)\n",
        "    if num_zeros:\n",
        "      print(f\"Ignoring {num_zeros} zero embeddings\")\n",
        "    data = data[mask]\n",
        "    embeddings = embeddings[mask]\n",
        "    tsne = sklearn.manifold.TSNE(\n",
        "        n_components=2, perplexity=40, metric='cosine', early_exaggeration=10.0,\n",
        "        init='pca', verbose=True, n_iter=400)\n",
        "    print('Running t-SNE...')\n",
        "    V_proj = tsne.fit_transform(embeddings)\n",
        "    data.loc[:,'x'] = V_proj[:, 0]\n",
        "    data.loc[:,'y'] = V_proj[:, 1]\n",
        "\n",
        "    return visualize_item_embeddings(data, 'x', 'y')\n",
        "\n",
        "\n",
        "_COLORS = plt.rcParams['axes.prop_cycle'].by_key()['color']*3\n",
        "\n",
        "# Bar plots of sliced metrics\n",
        "def _bar_plot(metric_fn, models, ylabel, ylim=[.7, 1.6]):\n",
        "  fig, ax = plt.subplots(figsize=[7, 5])\n",
        "  ax.set_xlabel(\"Popularity bucket\")\n",
        "  ax.set_ylabel(ylabel)\n",
        "  hatches = {\"DPALS (uniform)\": \"//\", \"DPALS (tail)\": r\"\\\\\"}\n",
        "  n = len(models)\n",
        "  delta = 1\n",
        "  width = delta/(n+1)\n",
        "  offset = -width*(n-1)/2\n",
        "  for (label, model, c) in models:\n",
        "    metrics = metric_fn(model)\n",
        "    ax.bar(np.arange(len(metrics)) + offset, metrics, width=width, label=label,\n",
        "           hatch=hatches.get(label), alpha=.99, color=_COLORS[c])\n",
        "    offset += width\n",
        "  ax.legend()\n",
        "  ax.grid()\n",
        "  ax.set_ylim(ylim)\n",
        "\n",
        "\n",
        "def bar_plot_rmse(models, item_frac, num_buckets=5, ylim=[.7, 1.6]):\n",
        "  def rmse(model):\n",
        "    return model.eval_test.sliced_rmse(\n",
        "        num_buckets=num_buckets, item_frac=item_frac)\n",
        "  _bar_plot(rmse, models, ylabel=\"RMSE\", ylim=ylim)\n",
        "\n",
        "\n",
        "def bar_plot_recall(\n",
        "    models, item_frac=0.1, num_buckets=5, scale_k=True, ylim=[0, 0.55]):\n",
        "  def recall(model):\n",
        "    if scale_k:\n",
        "      recalls = [\n",
        "          model.eval_test.sliced_recall(\n",
        "              num_buckets=num_buckets, item_frac=item_frac, k=k)[i]\n",
        "          for i, k in enumerate([100, 80, 60, 40, 20])]\n",
        "    else:\n",
        "      recalls = model.sliced_test_recall(\n",
        "          num_buckets=num_buckets, item_frac=item_frac, k=20)\n",
        "    return recalls\n",
        "  _bar_plot(recall, models, ylabel=\"Recall@k\", ylim=ylim)\n",
        "\n",
        "\n",
        "def bar_plot_overlap(\n",
        "    models, ref_model, item_frac=0.1, num_buckets=5, k=20, ylim=[0, 0.55]):\n",
        "  # Computes the overlap in nearest newighbors, between private models and a\n",
        "  # reference (non-private) models\n",
        "  def neighbors(model):\n",
        "    embeddings = model.col_embeddings_freq\n",
        "    embeddings = embeddings/tf.linalg.norm(embeddings, axis=1)[:, None]\n",
        "    scores = tf.matmul(embeddings, embeddings, transpose_b=True)\n",
        "    _, ids = tf.math.top_k(scores, k=k)\n",
        "    return ids\n",
        "  def overlap(model):\n",
        "    buckets = ref_model.eval_train._get_buckets(\n",
        "        num_buckets=num_buckets, item_frac=item_frac)\n",
        "    recalls = tf.sets.size(\n",
        "        tf.sets.intersection(neighbors(ref_model), neighbors(model))).numpy()/k\n",
        "    overlaps = []\n",
        "    for bucket in buckets:\n",
        "      overlaps.append(np.nanmean(recalls[bucket]))\n",
        "    return overlaps\n",
        "  _bar_plot(overlap, models, ylabel=\"Overlap with the ALS baseline\", ylim=ylim)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ht3B1b9UOt8G"
      },
      "source": [
        "## Load data"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "h3PHbma8Zn4z"
      },
      "outputs": [],
      "source": [
        "ml10m = load_data(f'ml10m/')"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-cla92TYZof7"
      },
      "outputs": [],
      "source": [
        "ml20m = load_data(f'ml20m/')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yA2m-2u6bozz"
      },
      "source": [
        "# Tuned DPALS models"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6eM98abdpIKn"
      },
      "source": [
        "## ML20M"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5Za2HhyER8lw"
      },
      "source": [
        "### Non-private baseline"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 459
        },
        "executionInfo": {
          "elapsed": 105071,
          "status": "ok",
          "timestamp": 1681313265346,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "CkUO7QHL1uDD",
        "outputId": "b30ba6bd-1298-46c4-ce20-67e743f4fb05"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "\u003cFigure size 600x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "step 15:\n",
            "|------------|--------|\n",
            "| valid_RMSE | 0.6890 |\n",
            "| valid_R@20 | 0.3670 |\n",
            "| test_RMSE  | 0.6932 |\n",
            "| test_R@20  | 0.3631 |\n",
            "\n",
            "Training took 5.41s per sweep, 1.84s per eval\n"
          ]
        }
      ],
      "source": [
        "baseline_20m = DPALSModel(\n",
        "    ml20m, binarize=True, regularization_weight=40.0,\n",
        "    unobserved_weight=0.2, embedding_dim=64, recall_positions=[20],\n",
        "    row_reg_exponent=0, col_reg_exponent=0, init_stddev=0.1,\n",
        "    sanitizer=Sanitizer(item_frac=0.1, exact_split=True),\n",
        "    random_seed=1234, batch_size=10_000)\n",
        "baseline_20m.train(num_steps=15, compute_metrics=True,\n",
        "                   plot_metrics=RECALL_METRICS, num_eval_points=5)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bfqGFbfA-LX-"
      },
      "outputs": [],
      "source": [
        "def train_20m(\n",
        "    method, budget, max_norm, steps, reg, unobs, epsilon, count_stddev,\n",
        "    weight_exp=0):\n",
        "  delta = 8e-6\n",
        "  sanitizer = Sanitizer(\n",
        "      budget=budget, method=method, item_frac=0.1,\n",
        "      center=False, count_stddev=count_stddev,\n",
        "      count_sample=budget, weight_exponent=weight_exp, exact_split=True,\n",
        "      random_seed=1234)\n",
        "  optimizer = DPALSOptimizer(budget, max_norm)\n",
        "  accountant = DPALSAccountant(sanitizer, optimizer, steps=steps)\n",
        "  accountant.set_sigmas(epsilon, delta, sigma_ratio0=1, sigma_ratio1=1)\n",
        "  model = DPALSModel(\n",
        "      ml20m, binarize=True, embedding_dim=64, init_stddev=0.1,\n",
        "      regularization_weight=reg, unobserved_weight=unobs,\n",
        "      sanitizer=sanitizer, optimizer=optimizer, recall_positions=[20],\n",
        "      random_seed=1234, batch_size=10_000)\n",
        "  model.train(num_steps=steps, compute_metrics=False)\n",
        "  return model"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EUcrrvAI4Wum"
      },
      "source": [
        "### $\\epsilon = 1$"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "Y3xEhhZzEF3Q"
      },
      "outputs": [],
      "source": [
        "def train_20m_eps1(method, max_norm, reg, unobs, weight_exp=0):\n",
        "  return train_20m(\n",
        "      method=method, max_norm=max_norm, reg=reg, unobs=unobs,\n",
        "      weight_exp=weight_exp, budget=100, steps=3, count_stddev=200, epsilon=1)\n",
        "\n",
        "model20m_eps1_tail = train_20m_eps1(method=\"tail\", reg=40, unobs=0.4, max_norm=0.1)\n",
        "model20m_eps1_unif = train_20m_eps1(method=\"uniform\", reg=30, unobs=0.4, max_norm=0.1)\n",
        "model20m_eps1_ada1 = train_20m_eps1(method=\"adaptive_weights\", weight_exp=-1, reg=10, unobs=0.8, max_norm=0.05)\n",
        "model20m_eps1_ada2 = train_20m_eps1(method=\"adaptive_weights\", weight_exp=-1/2, reg=30, unobs=0.4, max_norm=0.05)\n",
        "model20m_eps1_ada3 = train_20m_eps1(method=\"adaptive_weights\", weight_exp=-1/3, reg=30, unobs=0.4, max_norm=0.05)\n",
        "model20m_eps1_ada4 = train_20m_eps1(method=\"adaptive_weights\", weight_exp=-1/4, reg=30, unobs=0.4, max_norm=0.05)\n",
        "model20m_eps1_ada0 = train_20m_eps1(method=\"adaptive_weights\", weight_exp=0, reg=50, unobs=0.4, max_norm=0.1)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 334
        },
        "executionInfo": {
          "elapsed": 27836,
          "status": "ok",
          "timestamp": 1680919154285,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "F2E9ptNZsvC7",
        "outputId": "717e324d-e2d6-48c6-ed37-5acc5cdd2d31"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbkAAAE9CAYAAACWdRzmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAABFbUlEQVR4nO3df1zUZbr4/9fFKChh+QNxSzZ/ZJqCiGitlehQxJLbQ1Fz0dzU\ntR/rx9hSP5/db1unVt1163Rc2nXd8lB6slahToWWq7W5QkumpQh5LCRZVxbLMjgrQYgI3N8/gImB\ngRlgxhmG6/l48Gje7/c99/uaO5yL96/rFmMMSimllD8K8HYASimllKdoklNKKeW3NMkppZTyW5rk\nlFJK+S1NckoppfyWJjmllFJ+q5e3A+io0NBQM3z4cG+H0WXffPMNl112mbfD8Gk6Rs7pGLVPx8c5\nfxmj3NzcUmPM4Jbru12SGz58OIcPH/Z2GF2WnZ2N1Wr1dhg+TcfIOR2j9un4OOcvYyQixY7W6+lK\npZRSfkuTnFJKKb+lSU4ppZTf6nbX5By5ePEip0+fprq62tuhuOyKK66goKDA22H4tK6OUZ8+fQgP\nD6d3795ujEop1Z34RZI7ffo0/fr1Y/jw4YiIt8NxSUVFBf369fN2GD6tK2NkjKGsrIzTp08zYsQI\nN0emlOou/OJ0ZXV1NYMGDeo2CU55nogwaNCgbnV0r5RyP79IcoAmONWK/k4opfwmySmllFItaZJT\nSinltzTJuVlmZiYiwvHjxx1uX716NevXr3faj8ViITo6moiICCZMmEBqair19fWttkdGRjJv3jyq\nqqrajSEkJMThftatW0dERARRUVFER0fzwQcftGpz/vx5pk+fTl1dndO4O2rp0qWEhYURGRlpW1dT\nU8O0adOora11+/6UUj2LX9xd2dI1j+x2a39//80Ml9ump6czdepUMjIyWL16daf32bdvX/Lz8wE4\ne/Ysd911F+Xl5axZs6bV9oULF7Jp0yZWrVrVoRgOHDjArl27OHLkCEFBQZSWllJTU9Oq3ZYtW5gz\nZw4Wi6XTn6ctS5YsISUlhUWLFtnWBQYGcuutt/Laa69x7733un2fSqmeQ4/k3KiyspL9+/ezefNm\nMjIybOvXrVvHmDFjiI+Pp7Cw0O49SUlJTJo0iYiICNLS0hz2GxYWRlpaGhs3bsQY02p7bGwsRUVF\n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\nmjSJiIgI0tLSHPYbFhZGWloaGzduxFFB7djYWIqKitqNwZEzZ84QGhpKUFAQAKGhoVx11VWt2m3b\nto1Zs76d79Zqtdo+R1lZGZGRke3upy0ffvgho0aNYuTIkQQGBjJ//nx27twJNIzLK6+80ql+lVLe\n1ZTovJ3gQJOcW+3YsYPExERGjx7NwIEDOXLkCLm5uWRkZJCXl8frr7/OoUOH7N6zZcsWcnNzOXz4\nMBs2bKCsrMxh3yNHjqS+vp6zZ+0nUK+trWXPnj2MHz++zRjakpCQQElJCaNHj2b58uW8++67rdrU\n1NRw8uRJhg8fbltXVFTEtddeCzTMDN607+ZiY2OJjo5u9bN3715bm88++4zvfvfb2ZjCw8P57LPP\nAIiMjGw3dqWUb/OV2pV+ebrSW9LT01mxYgUA8+fPJz09naFDhzJ79myCg4MBmDnTfqLBDRs2kJmZ\nCUBJSQknTpxg0KBBDvtvfhR3/vx5oqOjgYaEcs8997QZQ0xMjMP+QkJCyM3NJScnh6ysLJKTk3ny\nySftZgYvLS2lf//+tuXi4mKGDh1qm9fu6NGjdjOFN8nJyXG4z7Y+T5OmyXMtFguBgYHdakoipXqS\noi9LW80A3lEHivOYh2fnk9Mk5yZlZWXs27ePY8eOISLU1dUhIqxcuZK2Zj3Pzs5m7969HDhwgODg\nYKxWa5vTy5w8eRKLxUJYWBhgf03OWQxPPfVUm3FbLBasVitWq5Xx48ezdetWuyTXt29fu5jy8/Pt\nklpubi7Jycmt+o2NjXU4o/r69euJj48HGo7cSkpKbNtOnz5td7r0woUL9OnTp83YlVLe82LjxKid\nTXRNN6XM40E3R2ZPT1e6yauvvsqiRYsoLi7m1KlTlJSUMGLECGJiYsjMzOT8+fNUVFTw5ptv2t5T\nXl7OgAEDCA4O5vjx4xw8eNBh31999RXLli0jJSWlzYTZXgzvvfeew/aFhYWcOHHCtpyfn8+wYcPs\n2gwYMIC6ujpbovvoo49sr0+cOMHOnTsdnq7MyckhPz+/1U9TggO4/vrrOXHiBP/4xz+oqakhIyPD\ndqRbVlZGaGgovXv3bvPzKqW8R2tX9jDp6enMnj3bbt3cuXPJyMggOTmZ6Oho5s6dS2zst4fmiYmJ\n1NbWEhUVxWOPPcaUKVNs25pOR0ZERBAfH09CQgK//OUvOxXD9u3bqaqqIjw83PaTmppKZWUlixcv\n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\n6Ri1rzuMz7HPnE/mEhlw0qW+PgkMdNpm5Bf2yzVhgwk8+5Xduop+33XaT33dl+1uv3Cxln69BxIS\nGNxuu95D3fP/Jy4uLtcYM7nlek8eyZ0Gmo9UOPB5y0YiEgU8D9zuKMEBGGPSaLxeN3nyZGO1Wt0e\n7KWWnZ2NP3wOT9Ixck7HqH3dYXzucWkWAtceml4x4mqnbdKfqbVbLl6+nGHPPGO3Lmv6H5z2U/2v\n55y2uWXEz5y2CV8Y67RNV3jymtwh4FoRGSEigcB84I3mDUTkauB14G5jzKcejEUppZQb9fjalcaY\nWiAFeBsoAF4xxnwsIstEZFljs8eBQcAzIpIvIoc9FY9SSin36S61Kz06n5wxZjewu8W6Tc1e3wvc\n68kYlFJKuV/TzSWLbprEqCGhHXqv1q5USinl07R2pVJKKb+mtSuVUkr5tR5du1IppZT/65G1K5VS\nSvUcPbF2pVJKqR6kp9WuVEop1cP4Wu1KTXJKKaXcqinRxV0536sJDvR0pVJKKQ8YNSTU6wkONMkp\npZTqhB5fu1IppZT/6i61KzXJKaWU6rDOlPRqcilrV/bYG0+ucWUOp9/MuASR+C4dI6VUW5rfRdmR\nIs1au1IppVS3oLUrlVJK+TWtXamUUsqv+XLtyh57TU4p5X8KIiLtlquXL6fggRS7dWM/PnYpQ+ox\n2rpG5+3SXprklFLdQvSL0U7bpHs+DNWOlonuQIDWrlRKKVgz0HmbEVd7Pg7VZVq7UimllF/T2pVK\nKaX8mtauVEop1W1p7UqllFJ+q7vUrtRrckopj3GlNBzA34M8HIhyu86U9GpyKWtX6pGcUkqpDuto\nSa8ml/q5OT2SU6oLtIi16sk6WqRZa1cqpZTqVrR2pVJKKb/my7UrNckppZTqsrYSnbdrV2qSU0op\n5RYtE523ExzojSdKKaXcSGtXKqWU8mtau1IppZRf09qVSimlui2tXamUUspvdZfalZrklFJKdVhn\nSno10dqVSimlfFp3qV2pSU4ppVSndDTRae1KpZRS3YrWrlRKKeXXfLl2pT4MrpTqUZ5ZnuW0zfJn\n4i5BJP6lrWl3vF3ay6NHciKSKCKFIlIkIg872H6diBwQkQsi8v88GYtSSinP6lG1K0XEAvwRuA04\nDRwSkTeMMZ80a/a/wINAkqfiUEopden0pNqVNwBFxpiTACKSAcwCbEnOGHMWOCsiP/BgHEoppS4h\n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\n/wGzOQtkh0TxpAAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_recall([\n",
        "    (\"AdaDPALS ($\\mu=1$)\",   model20m_eps1_ada1, 0),\n",
        "    (\"AdaDPALS ($\\mu=1/2$)\", model20m_eps1_ada2, 1),\n",
        "    (\"AdaDPALS ($\\mu=1/3$)\", model20m_eps1_ada3, 2),\n",
        "    (\"AdaDPALS ($\\mu=1/4$)\", model20m_eps1_ada4, 3),\n",
        "    (\"AdaDPALS ($\\mu=0$)\",   model20m_eps1_ada0, 4),\n",
        "    (\"DPALS (tail)\",         model20m_eps1_tail, 5),\n",
        "    (\"DPALS (uniform)\",      model20m_eps1_unif, 6),\n",
        "], num_buckets=5, scale_k=True)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 338
        },
        "executionInfo": {
          "elapsed": 1152,
          "status": "ok",
          "timestamp": 1680919189303,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "Y6W3pCgPmAAw",
        "outputId": "74127eb3-5b04-4568-fef1-40de2a576ab7"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbkAAAFBCAYAAADqldFcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAAA4J0lEQVR4nO3deZhU1bX///eioZkaRUFJBBWcAyjNIAEUbRzRGJUoEScUR+KI\n/pJco1/HXBOvMSThqiEaJxIDJhqcghoH2jiASktLQECJUeE60vcCIjKv3x9V3VYX1adOd5/TXcPn\n9Tz1UHVq16lV27JWn3P2XtvcHRERkULUprUDEBERiYuSnIiIFCwlORERKVhKciIiUrCU5EREpGAp\nyYmISMGKNcmZ2WgzW2pmy8zsqgbaVJhZtZktMrMX44xHRESKi8U1T87MSoB3gCOBFcAbwKnu/nZK\nm67Aq8Bod//QzHZ2989iCUhERIpOnEdyQ4Fl7v6eu28EZgAnpLU5Dfiru38IoAQnIiJRijPJ9QSW\npzxekdyWah9gBzOrNLMqMxsfYzwiIlJk2sa4b8uwLf3caFtgMHA40BGYY2Zz3f2dejsyuwC4AKBj\nx46Dd9111xjCjdfWrVtp00bjfMJQX4WnvgpH/RRevvbVO++8s9Ldd0rfHmeSWwGkZqNewEcZ2qx0\n9y+BL83sH8AAEtfy6rj7XcBdAEOGDPF58+bFFnRcKisrqaioaO0w8oL6Kjz1VTjqp/Dyta/M7INM\n2+NM128Ae5tZHzMrBcYBj6e1eQwYaWZtzawT8G1gcYwxiYhIEYntSM7dN5vZJcAzQAlwr7svMrOJ\nyeenuvtiM3saWABsBX7v7gvjiklERIpLnKcrcfdZwKy0bVPTHv8C+EWccYiISHGKNcm1lE2bNrFi\nxQrWr1/f2qE0aPvtt2fxYp2JDSOuvurQoQO9evWiXbt2ke9bRHJTQSS5FStW0KVLF3r37o1ZpkGd\nre+LL76gS5curR1GXoijr9ydmpoaVqxYQZ8+fSLdt4jkrvwbJ5rB+vXr6datW84mOGl9Zka3bt1y\n+mhfRKJXEEkOUIKTrPQdESk+BZPkRERE0inJiYhIwVKSi9jMmTMxM5YsWZLx+RtuuIHbbrutUfss\nKSmhvLycfv36MWDAACZPnszWrVu3eb5///6MHTuWdevWZY2nrKws43vdfPPN9OvXjwMOOIDy8nJe\ne+21bdp89dVXHHrooWzZsqVRnyOMc845hz322IP+/ftv89yFF17IK6+8wtChQxkwYAD9+vXj+uuv\nr3t+48aNHHLIIWzevDnyuEQkPxXE6Mp05dPKI91f9fjq0G2nT5/OwQcfzIwZM7jhhhsief+OHTtS\nXZ2I4bPPPuO0005j9erV3Hjjjds8f/rppzN16lSuvPLKRsczZ84cnnzySd58803at2/PypUr2bhx\n4zbt7r33Xr73ve9RUlISyedLdfbZZzNhwgR+8IMfbPPca6+9xp133skLL7xAWVkZmzZt4uCDD+aY\nY45h2LBhlJaWcvjhh/PQQw9x+umnRx6biOQfHclFaO3atbzyyivcc889zJgxo277zTffzKBBgzji\niCNYunRpvdeceOKJDB48mH79+nHXXXdlfY+dd96Zu+66i9tvv51MawGOHDmSZcuWBcbTkI8//pju\n3bvTvn17ALp3784uu+yyTbsHH3yQE074etWkioqKus9VU1OT8SgsrEMOOYQddthhm+2LFy9mn332\noaSkpO4odNOmTWzatKnegJITTzyRBx98sMnvLyKFRUkuQo8++iijR49mn332Yccdd+TNN9+kqqqK\nGTNm8PLLL/PXv/6VN954o95r7r33Xqqqqpg3bx5TpkyhpqYm6/vssccebN26lc8+q7/83ubNm3nq\nqafYf//9G4wnyFFHHcXy5cvZZ599uOiii3jxxW0Xat+4cSPvvfcevXv3rtu2bNky9t57bwAWLFhQ\n9/61Ro4cSXl5+Ta35557LutnrfXUU08xevRoALZs2UJ5eTk777wzRx55JN/+9rfr2vXv33+bPhaR\n4lWQpytby/Tp05k0aRIA48aNY/r06fTs2ZMxY8bQqVMnunTpwvHHH1/vNVOmTGHmzJkALF++nHff\nfZdu3bplfa/Uo7ivvvqK8vJyIJFQzj333AbjGTRoUIP7LCsro6qqipdeeonZs2dzyimncMstt3D2\n2WfXtVm5ciVdu3ate/zBBx/Qs2fPuqU5FixYwAEHHFBvvy+99FLWz5PNM888w3333QckrkFWV1ez\natUqxowZw8KFC+uOHktKSigtLdXkexEBlOQiU1NTwwsvvMDChQsxM7Zs2YKZccUVVzQ4P6uyspLn\nnnuOOXPm0KlTJyoqKli/fj133HEHd999NwCzZs3a5nXvvfceJSUl7LzzzkD9a3LZ4rn11lsD54uV\nlJRQUVFBRUUF+++/Pw888EC9JNexY8d6E6qrq6vrJbWqqipOOeWUevscOXIkX3zxxTbvddttt3HE\nEUc0GEutdevWsWrVqm1OnXbt2pWKigqefvrpeqdIN2zYQIcOHbLuV0QKn05XRuThhx9m/PjxfPDB\nB7z//vssX76cPn36MGjQIGbOnMlXX33FF198wRNPPFH3mtWrV7PDDjvQqVMnlixZwty5cwG4+OKL\nqa6uprq6epsf9s8//5yJEydyySWXBCarhuJ5+eWXG3zN0qVLeffdd+seV1dXs/vuu9drs8MOO7Bl\ny5a6RPfWW2/V3X/33Xd57LHHtjld+dJLL9V9ntRbmAQHMHv2bEaNGlX3+VetWgUkjmCfe+459ttv\nv7q2NTU17LTTTqpPKSKAjuQiM336dK666qp620466SRmzJjBKaecwkEHHUSfPn0YOXJk3fOjR49m\n6tSpHHDAAey7774MGzYs475rT0du2rSJtm3bcuaZZ9aNnmxsPH/6058YOXIk69ato1evXnXPXXnl\nlRx66KFceumlrFq1irZt27LXXntlHAxz1FFH8fLLL3PEEUdQXV1Nx44dGTBgAAcccADf+ta3eOCB\nB7j22muz9lkmp556KrNnz6ampoZevXpx4403Mn/+fE4++WQgMTjmrLPOYsuWLWzdupXvf//7HHfc\ncXWvnz17Nscee2yT3ltECpC759Vt8ODBnu7tt9/eZluuWbNmTWuHEJk333zTzzjjDHd333PPPSP/\nbOn7GzhwoG/cuDHUa8eMGeNLlixp8Pl8+K40xuzZs1s7hLygfgovX/sKmOcZcoaO5KTRBg4cyKhR\no1i9ejVt2rSJfYBHtlGhtTZu3MiJJ57IvvvuG2s8Ii0pynm/jZnzWyiU5KRJzjnnHADeeeedVo7k\na6WlpYwfP761wxCRHKKBJyIiUrCU5EREpGApyYmISMFSkhMRkYKlJCciIgVLSU5ERAqWkpyIiBSs\ngpwnd9FhI9irR/es7ZZ9upJpr1YxfsTgwPZXTn88675KSkrYf//960pvnXXWWUyaNIk2bdpQWVnJ\nCSecwB577MH69esZN25c3YrW8+fPZ9CgQTz99NMcffTRdfsrKytj7dq19d5j6dKlXHjhhaxatYoN\nGzYwcuTIjGW3Pv74Y84//3yefPJJqqur+eijj7KWupo3bx7Tpk1jypQp3H///cybN4/bb7+d22+/\nnc6dOzNhwoSsfSAikmsK8khu2qtVLPt0ZdZ2e/XozvgRg0O3D1K7EsCiRYt49tlnmTVrVt3K3QDD\nhw9n/vz5zJs3jz/+8Y9UVVUBX6/cPX369Kzvcdlll3HFFVdQXV3N4sWLufTSSzO2mzx5Mueffz6Q\nKLKcaSWDdEOGDGHKlCnbbD/nnHMybhcRyQcFmeQak7iiTHS1glbv7ty5M4MHD+Zf//oX7s7DDz/M\n/fffz9///vd6S9hk8vHHH9crqpxe7b/WI488wujRo9m4cSPXXXcdDz30EOXl5Tz00EO8/vrrjBgx\ngoEDBzJixIi6Fb0rKyvrFTqu1alTJ3r37s3rr7/e2G4QEWl1BZnkGpu44kh0Da3eXVNTw9y5c+nX\nrx+vvPIKffr0Yc8996SioiLrEdcVV1zBYYcdxjHHHMOvfvWruiVnUv373/9mhx12oH379pSWlnLT\nTTdxyimnUF1dzSmnnMJ+++3HP/7xD+bPn89NN93E1VdfnfWzDBkyJJKFT0VEWlpBJjnIjUSXehQ3\nZ84cBg4cyFFHHcVVV11Fv379mD59OuPGjQO+Xrk7yIQJE1i8eDFjx46lsrKSYcOGsWHDhnptPv74\nY3baaacG97F69WrGjh1L//79ueKKK1i0aFHWz7Hzzjvz0UcfZW0nIpJrCjbJQesmuvTVu2uvyVVV\nVTFx4kS2bNnCI488wk033UTv3r259NJLeeqppzKuoJ1ql1124ZxzzuGxxx6jbdu2LFy4sN7z6St3\np7v22msZNWoUCxcu5Iknnsh6ihRg/fr1dOzYMcSnFhHJLQWd5KB1El2Y1bufe+45BgwYwPLly3n/\n/ff54IMPOOmkk3j00Ucb3O/TTz/Npk2bAPjkk0+oqamhZ8+e9drss88+vP/++3WPu3TpUi9xrl69\nuu41999/f6jP884779C/f/9QbUVEcklBTiHINOT/zkbuo7HtG7t69/Tp0xkzZky9bSeddBK//e1v\nOfPMMzOu3L1ixQouv/xyOnToAMAvfvELvvGNb9TbR+fOndlzzz1ZtmwZe+21F6NGjeKWW26hvLyc\nn/zkJ/z4xz/mrLPOYvLkyRx22GGhPtsrr7xSN+VBRCSfWProv1w3ZMgQnzdvXr1tixcv5lvf+lYr\nRRTOF198EfviorVmzpxJVVUV//mf/9nsfc2fP5/Jkyfzhz/8IYLIwomzr/Lhu9IYlZWVVFRUtHYY\nOS+f+6mlF03N174ysyp3H5K+vSCP5IrdmDFjqKmpiWRfK1eu5Kc//Wkk+xIRaWlKcgXqvPPOi2Q/\nRx55ZCT7ERFpDQU/8ERERIpXrEnOzEab2VIzW2ZmV2V4vsLMVptZdfJ2XZzxiIhIcYntdKWZlQB3\nAEcCK4A3zOxxd387relL7r5tPSkREZFmivNIbiiwzN3fc/eNwAzghBjfT0REpJ44B570BJanPF4B\nfDtDu+Fm9hbwEfBDd89eZyqLv5w+heG7D8zabs4H85k48zqmjrkpsH2vn43Muq9cXWqnKaZOnUqn\nTp0YP348S5YsYdy4cZgZDz/8MHvuuWeT9pnJk08+yRtvvFFvtQYRkSjFmeQylfpIn5T3JrC7u681\ns2OBR4G9t9mR2QXABQA9evSgsrKy3vPbb799vaoew3cbuO07pZnzwXwmPnodU0+8KWv7bKW2IFFO\nq7aI8eeff865557LZ599xjXXXMO6desYNmwYDz/8MF9++SUHHXQQo0aNYuDAgTzwwAMMHz6cadOm\nMWLEiMD3veiii5g4cSLf+c53AFi0aFHG2G655RbOOOOMUHFncvrpp9e9/0MPPcTo0aO55pprMsaU\nzt1xd9q0yX6S4JBDDuGaa67hoosuolOnTnXbt2zZ0uTYs1m/fv023598tnbt2oL6PHHJ5366oPMF\nke0rTB/kc19lEmeSWwHsmvK4F4mjtTruvibl/iwzu9PMurv7yrR2dwF3QWIyePpExcWLF9ebPLw6\ncyWtOnUJLssRXK2wE5Nr23Xp0oV77rmHAw88kJ///Od06tQJM6NLly506dKFAw88kE8++YSysjIe\nf/xxnn32WUaOHEm7du3qqplket/PP/+cvffeu277sGHDMsbxxBNPcOutt9K+fft6C6ACHHfccfzw\nhz+koqKCsrIyLr/8cp588kk6duzIY489Ro8ePbjhhhsoKyujb9++/Pa3v6WkpITXXnuN2bNnM3ny\nZO69914gMU1h0qRJvP/++xxzzDGMGjWKOXPm8Otf/5oLL7yQgw8+mLlz5zJgwAAmTJjA9ddfz2ef\nfcaDDz7I0KFDATjssMN48cUX+f73v18Xf5yTwTt06MDAgdn/m+eLfJ2429LyuZ8mTZsU2b6qT6rO\n2iaf+yqTOK/JvQHsbWZ9zKwUGAfUq7dlZt+wZHFHMxuajCeaWcwNCHuKMrV9U+TCUjvZfPnllwwb\nNoy33nqLQw45hLvvvrve88ceeywTJ07kiiuuYPbs2VRVVXHffffx2muvMXfuXO6++27mz0/0z9Kl\nSxk/fjzz589n9913Z9myZVx++eUsWLCAJUuW8Kc//YmXX36Z2267jZ/97Gd176FlfEQkTrElOXff\nDFwCPAMsBv7s7ovMbKKZTUw2OxlYmLwmNwUY5zHWGWtKgps4s+mzGnJxqZ1UpaWldQulDh48uF5h\n50xefvllxowZQ+fOnSkrK+N73/teXYLafffd6x1Z9unTh/333582bdrQr18/Dj/8cMyM/fffv977\naBkfEYlTrBVP3H0WMCtt29SU+7cDt8cZQ62mJripY25q0vulLrWzePFihg8fztNPP133fO1SO48/\n/jg333wz7k5NTU3WU3W1S+2cc8459O/fn4ULFzJ48OC659OX2mnbti1bt26te5z6XLt27epWSSgp\nKWHz5s2Bnyno74/OnTvXe5x6JNmmTZu6x23atKn3PlrGR0TiVBQVT5qT4MK0T5dLS+307t2b6upq\ntm7dyvLly3n99dcb/XlqHXLIITz66KOsW7eOL7/8kpkzZzJyZPaRp0G0jI+IxKkga1emD/kfy0jG\nclno1ze2PeTuUjsHHXRQ3anD/v37M2jQoEZ9rlSDBg3i7LPPrhs0ct555zFw4MCspzmDzJ49m5//\n/OdNfr2ISBAttdNC8nWpnTh9+umnnHbaaTz//PP1tmupnfAKbSRcXPK5n7TUTjhaaqeIRLnUTpw+\n/PBDfvnLX7Z2GCJSwJTkClRUS+3E6cADD2ztEESkwBXMwJN8O+0qLU/fEZHiUxBJrkOHDtTU1OhH\nTBpUO0UjtaKMiBS+gjhd2atXL1asWMHnn3/e2qE0aP369fqBDSmuvurQoUO9EasiUvgKIsm1a9eO\nPn36tHYYgSorKwuqZmKc1FciEpWCOF0pIiKSiZKciIgULCU5EREpWKGuyZnZ7sDe7v6cmXUE2rp7\nPKtaiohILCafeny9x8s+Xcm0V6sYP2Iwe/XoDkDPo45n8u8mZ3x9bfu16zdkfD4XZT2SM7PzgYeB\n3yU39SKxgreIiOSxvXp0Z/yIwUx7tYpln64M3T6fhDldeTFwELAGwN3fBXaOMygREWkZTUl0+SRM\nktvg7htrH5hZW0CzrkVECkRqotuwKXhdyXwTJsm9aGZXAx3N7EjgL8AT8YYlIiItqTbR1axdF+qI\nLl+ESXJXAZ8D/wQuJLHS9/+LMygREWl5e/XoTreyTqFPXeaDrEnO3be6+93uPtbdT07e1+lKEZE8\nEyZxtW/XtlHX6HJdmNGVB5nZs2b2jpm9Z2b/NrP3WiI4ERGJTmNHURZCogtzuvIeYDJwMHAgMCT5\nr4iI5JGmTBfI90QXJsmtdven3P0zd6+pvcUemYiIRKqp8+LyOdGFSXKzzewXZjbczAbV3mKPTERE\nIldsiS5MWa9vJ/8dkrLNgcOiD0dEROKWmrhSS3qFbZ9PsiY5dx/VEoGIiEjLaU6iu/rqlxpsN+eD\n+UyceR1Tx9zE8N2zrwvZ62cjGx17YzSY5MzsDHf/o5ldmel5d89cwVNERPJCUxNdQxqb4OZ8MJ+x\nxJvkgq7JdU7+26WBm4iI5Lmoalc2JcFNnHldo+NtrAaP5Nz9d8l/b4w9ChERaTWpiW7YuPGNfn1T\nE9zUMTc1JdxGCTpdOSXohe5+WfThiIhIa0ivXRl2tYHmJLgw7ZsraOBJVezvLiIiOaO2duW1Ia/R\n5XqCg+DTlQ+kPjazzu7+ZfwhiYhIHMIcoaXWrgxKdPmQ4CBc7crhZvY2sDj5eICZ3Rl7ZCIiEqmo\nJoDnS4KDcBVPfg0cDdQAuPtbwCExxiQiIjGIqtJJviQ4CJfkcPflaZu2xBCLiIjEKKqSXvmS4CBc\nkltuZiMAN7NSM/shyVOXIiKSX6JIdPmS4CBckpsIXAz0BFYA5cnHIiKSh+Iu0pwrCQ7CrQy+0t1P\nd/ce7r6zu5+hpXZERPJbcxJdkFxKcBBudOWtZradmbUzs+fNbKWZnRFm52Y22syWmtkyM7sqoN2B\nZrbFzE5uTPAiItJ0TU10DWnKqMu4hTldeZS7rwGOI3G6ch/gR9leZGYlwB3AMUBf4FQz69tAu/8C\nnmlE3CIiEoFCr10ZJsm1S/57LDDd3f835L6HAsvc/T133wjMAE7I0O5S4BHgs5D7FRGRCKUmug2b\nNjf69blcuzJMknvCzJaQWDT1eTPbCVgf4nU9gdSpByuS2+qYWU9gDDA1XLgiIhKH9NqVYeX6xHBz\n9+yNzHYA1rj7FjPrBGzn7p9kec1Y4Gh3Py/5+ExgqLtfmtLmL8Av3X2umd0PPOnuD2fY1wXABQA9\nevQYPGPGjNAfMFesXbuWsrKy1g4jL6ivwlNfhZPP/fR2zduR7avbmtKsbdp22Z4PP1xOt7JOtG+X\nufLjjqXfAGDtxnV8uOojduu6C2WlnbLuO1P7dj2j+e8yatSoKncfkr4968rgST2BI82sQ8q2aVle\nswLYNeVxL+CjtDZDgBlmBtAdONbMNrv7o6mN3P0u4C6AIUOGeEVFRciwc0dlZSX5GHdrUF+Fp74K\nJ5/7adK0SZHta8QfOmWtXdnzqON598mHA4s0H9TnR/WOyA7c/ZtZ37uh9r1Ob71FUwEws+uB/07e\nRgG3AseH2PcbwN5m1sfMSoFxwOOpDdy9j7v3dvfewMPARekJTkREoqHalZmdDBwOfOLuE4ABQPts\nL3L3zcAlJEZNLgb+7O6LzGyimU1sRswiItIEql2Z2VfuvhXYbGbbkRgFuUeYnbv7LHffx933dPeb\nk9umuvs2A03c/exM1+NERCQaql2Z2Twz6wrcTWIh1TeB1+MMSkRE4qHalWnc/SJ3X5U8+joSOCt5\n2lJERPKQalemMbPvmdlkEhO394w3JBERiZtqVyYlVwGfCPwTWAhcaGZ3xB2YiIjES7UrEw4lMan7\nPne/j0R5r4pYoxIRkRah2pWwFNgt5fGuwIJ4whERkZZWyLUrG6x4YmZPAA5sDyw2s9eTj78NvBp7\nZCIi0mLSa1dmq4xSK9cnhgeV9bot9ncXEZGcsVeP7nQr6xRY0itVric4CEhy7v5ii0QgIiItIswR\nWvt2betOXQYlunxIcBByCoGIiOQ/1a4UEZGCpdqVAcysnZkNNLOd4wxIRETiodqVKcxsqpn1S97f\nHniLxBpy883s1BaKT0REIqTalV8b6e6LkvcnAO+4+/7AYODHsUcmIiKxUO3KhI0p948EHgVw90/i\nDEhEROKn2pWwysyOM7OBwEHA0wBm1hbo2BLBiYhIfIq9duWFJFb2vg+YlHIEdzjwt7gDExGR+BVt\n7Up3f8fdR7t7ubvfn7L9GWB57JGJiEiLKOTalU2dJ3dlpFGIiEirSq9dGVauTwxvapKzSKMQEZFW\nV1u7Mq5RlK0xKKWpSc4jjUJERGIXJnGl1q4Map8PCQ6CJ4N/YWZrMty+AHq2WIQiIhIJ1a5M4e5d\n3H27DLcu7l7SkkGKiEjzFWPtyqD15LZhZp2BE4HT3P07sUQkIgWvfFp5ZPuqHl8d2b4KXWriCrNe\nXEPt8yXBQYhrcmZWamYnmtmfgY+BI4CpsUcmIiKRU+3KJDM70szuBf4NnAz8Afhfd5/g7k+0VIAi\nIhIt1a5MeAbYEzjY3c9IJratLROWiIjESbUrE6sNzAWeM7NnzexcQANOREQKRFHXrnT3+e7+H+6+\nJ3ADMBAoNbOnzOyC2CMTEZHYFW3tylTu/oq7X0JiftyvgeFxBiUiIi1HtSuT3H2ruz/j7hPiCkhE\nRFqealeKiEhBU+1KERHJW6pd2QAzO9jMJiTv72RmfeINS0REoqbalRmY2fXAfwA/SW5qB/wxzqBE\nRCR6xVi7MsyR3BjgeOBLAHf/COgSZ1AiIhK9qCqd5EuCg3BJbqO7O8k15JJFmkMxs9FmttTMlpnZ\nVRmeP8HMFphZtZnNM7ODw4cuIiKNpdqV2/qzmf0O6Gpm5wPPAXdne5GZlQB3AMcAfYFTzaxvWrPn\ngQHuXg6cA/y+EbGLiEgTqHZlCne/DXgYeATYF7jO3f87xL6HAsvc/T133wjMAE5I2/fa5FEiQGe0\n4riISItQ7coU7v6su//I3X/o7s+G3HdPYHnK4xVkWFHczMaY2RLgbySO5kREpAUUQ+1K+/pAqoEG\nZt8D/gvYGbDkzd19uyyvGwsc7e7nJR+fCQx190sbaH8IiaPEIzI8dwFwAUCPHj0Gz5gxI9vnyjlr\n166lrKystcPIC+qr8PK1r96ueTuyffXtln4VZFv52k8QbV91W1OacfuGTZupWbuObmWd6NKtOxvX\nrArcz46l39hm29qN6/hw1Ufs1nUXyko7ZY2ltv2AgeVhQs9q1KhRVe4+JH17mCS3DPiuuy9uzBua\n2XDgBnc/Ovn4JwDu/vOA1/wbONDdG/yTYsiQIT5v3rzGhJITKisrqaioaO0w8oL6Krx87auWXhk8\nX/sJou2r8U/t1uBzyz5dybRXq7hzym9YOXtW4H6+3+dH9R43Z97c2AcvCxd8FmaWMcmFOV35aWMT\nXNIbwN5m1sfMSoFxwONpQe1lZpa8PwgoBWqa8F4iItIMhVq7sm1DTyRPUwLMM7OHgEeBDbXPu/tf\ng3bs7pvN7BISi6+WAPe6+yIzm5h8fipwEjDezDYBXwGneLZDSxERiUVt7cprX61i/IjBDS6rUyvX\nExwEJDnguyn31wFHpTx2IDDJAbj7LGBW2rapKff/i8T1PhERidmyT1dmTVyptSuDEl0+JDgISHK1\ny+mY2UHu/krqc2Z2UNyBiYhItLIlrlqpoy4ztc+XBAfhrsllmhMXZp6ciIjkkGKsXRl0TW44MALY\nycyuTHlqOxLX2EREJI9kO0IL2z5fEhwEH8mVAmUkEmGXlNsa4OT4QxMRkagVW+3KoGtyLwIvmtn9\n7v5BC8YkIiIxau4RHVlWFM2VBAfhalcqwYmIFBjVrhQRkYJWDLUrleRERIpYUxJdJk2dVhC3oMng\nAJjZTsD5QO/U9u6uFQNERApAaqIbNm58o1/fnHlzccua5IDHgJdILJa6Jd5wRESkNaTXrsw2GKVW\nrk8MD5PkOrn7f8QeiYiItKpCrF0Z5prck2Z2bOyRiIhIrMJcc0utXRnUPh8SHAQkOTP7wszWAJeT\nSHRfmdmalO0iIpJHoijpBfmT4CAgybl7F3ffLvlvG3fvmPI4cFVwERHJPcVYuzLr6Uozez7MNhER\nyW1RlPSCAqldaWYdzKwb0N3MdjCzHZO33sAuLRahiIhEpthqVwYdyV0IzAP2A94EqpK3x4A74g9N\nRETiENURXUNyJcFB8DW537h7H+CH7t4n5TbA3W9vwRhFRCRiRV+70swOS979HzP7XvqtheITEZGY\nFEPtyqDJ4IcCLwDfzfCcA3+NJSKRPFU+rTyyfVWPr45sXyJB0pfR6RmifSZNnVYwlsuaEHV4QevJ\nXZ/8d0KsEYiISKsq5NqVYaYQ/MvMHjSziWbWN/aIRESkxaXXrgwr1yeGhynr1Rf4HdANuM3M3jOz\nmfGGJSIiLa22dmVcoyhztXblFmBT8t+twKfAZ3EGJSIi0VPtyszWAL8G/g2c5e7D3f3CWKMSEZHI\nqXZlZqcC/wAuAmaY2Y1mdni8YYmISNRUuzIDd3/M3X9EogLKLOBs4MmY4xIRkYipdmUGZvaImf0L\n+A3QGRgP7BB3YCIiEj3VrtzWLcA+7n60u/+nu7/o7uvjDkxEROKh2pUp3P0Nd9/SEsGIiEjLKPra\nlSIiUtiKoXalkpyISBFrSqLLpKnTCuIWKsklVx6YbGa/NLMxcQclIiItJzXRbdi0udGvz+XalUGr\nEABgZncCewHTk5suNLMj3P3iWCMTEQmhrEN7xo8Y3OARBkDPo45n8u8ms+zTlXXV9jO1v3L643GG\nmtPSa1cG9WeqXJ8YHuZI7lDgaHe/z93vA44FKmKNSkQkpDhHCRabYq1duRTYLeXxrsCCeMIREWmc\nuIfDFxLVrsysG7DYzCrNrBJ4G9jJzB43s8BjezMbbWZLzWyZmV2V4fnTzWxB8vaqmQ1o0qcQkaKm\nRBeOaldmdh1wDHB98nYs8FPgl8lbRmZWAtyRfG1f4NQM69H9GzjU3Q9I7vOuxn4AERFQogtDtSsz\nSFY4afAW8NKhwDJ3f8/dNwIzgBPS9v2qu/9f8uFcoFdTP4iIiBJdMNWuzMDMhpnZG2a21sw2mtkW\nM1sTYt89geUpj1cktzXkXOCpEPsVEWlQXJU8CkWx1a40dw9uYDYPGAf8BRhCokDz3u5+dZbXjSUx\nKvO85OMzgaHufmmGtqOAO4GD3b0mw/MXABcA9OjRY/CMGTNCfLTcsnbtWsrKylo7jLyQr331ds3b\nke2rb7f0M/uZqa+g25rSjNs3bNpMzdp1dCvrRJdu3dm4ZlXgfjZs2sxu++wXWVxRiauvUvunfbuv\nZ5OVbtc1Y1+ltv9m5+CTbms3ruPDVR+xW9ddKCvtFNi2Xc9ovr+jRo2qcvch6dtDJTl3H2JmC5LX\nzjCzV919RJbXDQducPejk49/AuDuP09rdwAwEzjG3d/J9kGGDBni8+bNy9Ys51RWVlJRUdHaYTRJ\n+bTySPZTPb46VLt87auo+gnUV40x/qndGnyudl7cnVN+w8rZs7LuKxfnycXZV5nmDfY86nj+5++Z\n+6G2/ZIrn2vwPRp7BNfrZyMb8QkaZmYZk1yYgSfrzKwUqDazW83sChJL7mTzBrC3mfVJvn4cUK/n\nzGw34K/AmWESnIhIY6RPcJb6VLsy4UygBLgE+JLEPLmTsr3I3TcnX/MMsBj4s7svMrOJZjYx2ew6\nElMU7jSz6uSpURGRyDR2gnOxKfrale7+gbt/5e5r3P1Gd7/S3ZeF2bm7z3L3fdx9T3e/ObltqrtP\nTd4/z913cPfy5G2bQ00RkSBRTnAuVoVcu7LBJGdm/0yZqL3NLfbIRERC0HSBaDT11G6uTwwPOpI7\nDvhuwE1EpNVpXlx0iqp2pbt/QGJu2z3JU5b1bi0SnYhIFpoAHp5qV6Zx9y0kRldu30LxiIg0mhJd\nOKpdmdl64J9mdo+ZTam9xR2YiEhjKNFlp9qVmf0NuBb4B1CVchMRySlKdMFUuzIDd38A+DMw190f\nqL3FH5qISOOpdmWwYqtdGaZA83eBauDp5OPybOvIiYi0pqgreRSauI94cyXBQbjTlTeQWDZnFYC7\nVwN9YotIRCQCjZ3g3FAlj0IV1xFvLiU4CJfkNrv76rRtwVWdRURygGpXBiuG2pVtszdhoZmdBpSY\n2d7AZcCr8YYlIhKN2gnO16ZV289kxdUvNfhcY37Ao6qs3xJSE934EYMDF/2sbZ9JU6cVjOWyJkQd\nXpgjuUuBfsAG4E/AamBSjDGJiITWErUrc+0UXNQKuXZlmCO5fd39GuCauINpSa2x9peIRC99PbSG\npB+xhL0G15Qf8LHkz5FcrfRTu3H2T67Urqw12cyWmNlPzaxf7BGJiDRCLo0SbKnlY+JSVLUra7n7\nKKAC+By4K7k6wf+LOzARkTDiGg6fy6fgmkq1Kxvg7p+4+xRgIok5c/n7p4qIFJyoE12+/IA3VjH2\nT5jJ4N8ysxvMbBFwO4mRlb1ij0xEpBGiSnT59APeWKpdmdl9wP8BR7r7oe7+W3f/LOa4REQarbmJ\nrpATHKh2ZUNGAc8DO5hZh5jjERFplub8kBdygqul2pVJZtbWzG4FPgQeAP4ILDezW82sXUsFKCLS\nWE39IS/0BFermGpXBs2T+wXQBdjD3b8AMLPtgNuSt8vjD0+kOF102IhQ85S6jzqWstFHB877unJ6\ncdZTT/1hHjZufKj2xZDgajV23mBq+6uHNdwu1/on6HTlccD5tQkOwN3XAD8Ajo07MJFiFvYv5uZW\n8ih0UdeuzLUf8OYqhtqVQUnO3X2bQszuvgUVaBaJlRb+jE5jJzg3pNASXK2mJLpMcnXifFCSe9vM\ntjnGN7MzgCXxhSQiWuE6PNWubL5Crl0ZlOQuBi42s0oz+6WZ3WZmL5JYheAHsUcmUuSU6MKJu39y\n8RRcHJp6ajfXp100mOTc/X/c/dvATcD7JEZZ3uTuQ939f2KPTESU6ELIpVGCql0ZbfsohKld+YK7\n/7e7T3H351siKBH5mhJdMNWuDE+1K0UkJzXnh7wYqHZlOMXYP0pyInki6uHehUa1K7NT7UoRyWlR\nDfcuVKpdGUy1K0Uk5zV3uHehU+3KYKpdKSI5L+pKHoVGtSuDFVPtSiU5kRwU9ocnikoehaqxR7zF\nXLsyysFMudY/SnIiOUi1K6Oh2pXBiqF2ZdAqBCKRmnzq8XX3l326ssHq5z2POp7Jv5tcb1t6+0Kv\nrN/U6vBh2heb2iPea5vZP4WW4Gqlf396hmifSVMH7YzlsiZEHZ6O5KRVaIJzMPVPeKpd2XzFWrtS\nJFaa4BxMiS4c1a6MRqHWroz1dKWZjQZ+A5QAv3f3W9Ke3w+4DxgEXOPut8UZj+Sepi7cWCyas7Bl\nbfsVV7/UYPvG/uD0+tnIRn+GuMV5ajdXT8HFpbGndnM9wUGMR3JmVgLcARwD9AVONbO+ac3+l8Sq\nBkpuRUwTnIPlUm3GXJRL/aPalQ0rxNqVQ4Fl7v6eu28EZgAnpDZw98/c/Q1gU4xxSB7QBOdgUZ/a\nLbTq+qpdGU4x9k+cSa4nsDzl8YrkNpGMNME5WFTDvQvxCAVUuzKMYqxdae4ez47NxgJHu/t5ycdn\nAkPd/dIMbW8A1jZ0Tc7MLgAuAOjRo8fgGTNmNDu+t2vebvY+avXtln4Wdltr166lrKwssvdsSVH1\nVVlNG9q3y34ZuG2X7fnww+V0K+vUYPseffaKJKYoRfmd6ramtMHnNmzaTM3adXQr60SXbt3ZuGZV\n4L52LP1G3f21G9fx4aqP2K3rLpSVdsoaR3r7dj2j+Q7H2Vep/VP7/SndrmuD/VSvP9vt2Kz+qRVV\nP0H0fZWpf1Kl91XG/mS7ZvVPqqj6atSoUVXuPiR9e5wDT1YAu6Y87gV81JQduftdwF0AQ4YM8YqK\nimYHN2napGbvo1b1SdVZ21RWVhJF3K0hqr5adtniUBezex51PO8++XDgxe9TcnCeXJTfqfF/3y3w\n+WWfruTaV6u4c8pvWDl7VmDbg/r8CKj/F/WBu38zawyZ2vc6PZqBJ3H3VW3/1H5/eh51PP/z94a/\nM7Xt27fp2Kz+qRVVP0E8fZXeP6ky9VV6++8nv1NBwn7fouyrTOI8XfkGsLeZ9TGzUmAckHu/TNJi\nNBw+Oo09tVvIp+AyUe3KYMVUuzK2Izl332xmlwDPkJhCcK+7LzKzicnnp5rZN4B5wHbAVjObBPR1\n9zVxxRWHMJU8MlXxSG9/5wuvtki8rSWK4fDFYtmnK0P1T5jh3sWW4Gqlfn+GjRsfqn2x9k9j/3+8\neljD7XKtf2KdDO7us9x9H3ff091vTm6b6u5Tk/c/cfde7r6du3dN3s+rBJdOE5yDaYJzOFHWrizG\nBFdLtSuDFUPtSlU8iYFWcA6mRJddlP1TrAmuVlSrNRRy/0QxTzVXp6UoycVEE5yDKdEFi7J/Cj3B\nqXZl8xVy7UqtQhCjxl4TKDbNuSbwUKeukR2h5GKpKmi5a5j5/gOea/0z54P5jCU3v1NB0k/txtk/\nLfl905FczDTBOZhGwQUrplFwTZVL/ZPrlWGyaeyp3VxPcKAk1yK0gnOwpvyQ5+r/UHHIpdqMuSiX\n+ifXK8OodqU0iVZwbr6oa1cWSoKrpdqVwVS7Mpxi7B8luQho8EQ0ojq1my8/OI2l2pXBVLsyu2Ks\nXamBJxGIanBA0LpftcJ+YXJxMEWUE5wbUuiDBNK/P9kqnqf3XyH/gEPzB+vMaaP+CdM+n/pHR3IR\naKnh8LnwhWmOKCc4Z1Jop+Aa0tRTu4We4Go15/9H9U+49vnUP0pyEdEouOxyqX/y5RRcQ1S7MphG\n7QYrpt8rJbkI5dIor1yUS/2TK/8DNiRs/4QZtVuI/RNGY494NWo3fPsgudY/SnIR0yi4YBoFF45q\nV0ZDtSuDqXalNIlGwQXTKLjsVLsyOqpdGUy1K6VJmvvFKeQfcGh+olP/hG9fiP2TSrUrm6+Qa1cq\nycVIo+CCaRRcMI3aDSfX+idXr4ln09RTu7n+e6UkFzONggumUXDBimkUXFPlUv/k+jXxbFS7UppE\no+CCqXZlsFwalZqLcql/cv2auGpXSpNoFFzzqXZlMI3aDaZRu+EUY/8oyUVAo+CiodqVwTRqN5hG\n7WZXjLUrleQioFFw4UQ5wbkhhXIKriEatRtMo3aDRfWHQD71j5JcBDQKLhzVroyGRu0G06jdYKpd\nKU2iUXDZ5VL/5MspuIZo1G4wjdoNVky/V0pyEcqlUV65KJf6J1f+B2yIalc2n2pXBlPtSmkSjYIL\nplFw4ah2ZTRUuzKYaldKk2gUXDCNgstOtSujo9qVwVS7UppEo+CCaRRcMNWuDE+1K5tPtSulSTQK\nLphGwQXTqN1wcq1/cvWaeDaqXSlNolFwwTQKLlgxjYJrqlzqn1y/Jp6NaldKk2gUXDDVrgyWS6NS\nc1Eu9U+uXxNX7UppEo2Caz7VrgymUbvBNGo3nGLsHyW5CGgUXDRUuzKYRu0G06jd7FS7UppEo+DC\nUe3K5tOo3WAatRtMtSulSTQKLhzVroyGRu0G06jdYKpdKU2iUXDZ5VL/5MspuIZo1G4wjdoNVky/\nV0pyEcqlUV65KJf6J1f+B2yIalc2n2pXBlPtSmkSjYILplFw4ah2ZTRUuzKYalc2k5mNNrOlZrbM\nzK7K8LyZ2ZTk8wvMbFCc8bQUjYILplFw2al2ZXRUuzKYalc2kZmVAHcAxwB9gVPNrG9as2OAvZO3\nC4DfxhVPS9MouGAaBRdMtSvDU+3K5lPtyqYZCixz9/fcfSMwAzghrc0JwDRPmAt0NbNvxhhTi9Io\nuGAaBRdMo3bDybX+ydVr4tmodmXj9QSWpzxekdzW2DZ5TaPggmkUXLBiGgXXVLnUP7l+TTybQqxd\nae4ez47NxgJHu/t5ycdnAkPd/dKUNn8Dfu7uLycfPw/82N2r0vZ1AYnTmQD7AktjCTpe3YHmX/ku\nDuqr8NRX4aifwsvXvtrd3XdK39g2xjdcAeya8rgX8FET2uDudwF3RR1gSzKzee4+pLXjyAfqq/DU\nV+Gon8IrtL6K83TlG8DeZtbHzEqBccDjaW0eB8YnR1kOA1a7+8cxxiQiIkUktiM5d99sZpcAzwAl\nwL3uvsjMJiafnwrMAo4FlgHrgAlxxSMiIsUnztOVuPssEoksddvUlPsOXBxnDDkkr0+3tjD1VXjq\nq3DUT+EVVF/FNvBERESktamsl4iIFCwluZhlK20mXzOze83sMzNb2Nqx5DIz29XMZpvZYjNbZGaX\nt3ZMucrMOpjZ62b2VrKvbmztmHKZmZWY2Xwze7K1Y4mKklyMQpY2k6/dD4xu7SDywGbg/3P3bwHD\ngIv1vWrQBuAwdx8AlAOjkyO5JbPLgcWtHUSUlOTiFaa0mSS5+z+A/23tOHKdu3/s7m8m739B4kep\noCoFRSVZMnBt8mG75E0DETIws17Ad4Dft3YsUVKSi1fBly2T1mVmvYGBwGutHErOSp6CqwY+A551\nd/VVZr8GfgxsbeU4IqUkFy/LsE1/RUokzKwMeASY5O5rWjueXOXuW9y9nERFpaFm1r+VQ8o5ZnYc\n8Fl6ScVCoCQXr1Bly0Qay8zakUhwD7r7X1s7nnzg7quASnTdN5ODgOPN7H0Sl1UOM7M/tm5I0VCS\ni1eY0mYijWJmBtwDLHb3ya0dTy4zs53MrGvyfkfgCGBJqwaVg9z9J+7ey917k/idesHdz2jlsCKh\nJBcjd98M1JY2Wwz82d0XtW5UucvMpgNzgH3NbIWZndvaMeWog4AzSfy1XZ28HdvaQeWobwKzzWwB\niT86n3X3ghkeL9mp4omIiBQsHcmJiEjBUpITEZGCpSQnIiIFS0lOREQKlpKciIgULCU5kTRmtiU5\nLH+hmf3FzDpFvP9KMxvSyNfcZGZHJO9PamxMZrY2e6tQ+3nfzLqHbFuuqQ3S2pTkRLb1lbuXu3t/\nYCMwsTWDMbMSd7/O3Z9LbpoERJp4Y1IOKMlJq1KSEwn2ErCXme1oZo+a2QIzm2tmBwCY2Q1m9gcz\ne8HM3jWz85PbK1LX5DKz283s7PSdm9lvzWxe+lpnySOm68zsZWCsmd1vZieb2WXALiQmOM82s3PN\n7FcprzvfzDJWQTGzX5rZm2b2vJntlNxWd1RpZt2TZZ1qixrfZmb/TH7mS9P21dHMnk6+X+fkWoBv\nJNciOyFZ4ecm4JTkUfEpTel8keZSkhNpgJm1JbEW4D+BG4H57n4AcDUwLaXpASSWKBkOXGdmuzTi\nba5x9yHJfRxamzyT1rv7we4+o3aDu08hUf90lLuPIlFn8PhkLUuACcB9Gd6nM/Cmuw8CXgSuzxLX\nBUAfYGDyMz+Y8lwZ8ATwJ3e/G7iGRBmoA4FRwC9ILGlzHfBQ8qj4oaw9IRIDJTmRbXVMLs0yD/iQ\nRJ3Ig4E/ALj7C0A3M9s+2f4xd//K3VcCs0msIxjW983sTWA+0I/E4rq1siYGd/8SeAE4zsz2A9q5\n+z8zNN2asr8/Jj9PkCOAqcnSdLh76jp/jwH3uXttoj8KuCrZZ5VAB2C3bLGLtIS2rR2ASA76Krk0\nS51kUeR0nvZv6vbN1P8jskP6i82sD/BD4EB3/z8zuz+t3Zch4/09iaPLJWQ+isukNubUOFPf22h4\nWahXgGPM7E+eqAtowEnuvjS1kZl9O2QsIrHRkZxIOP8ATofE9TZgZcoabieYWQcz6wZUkCgE/AHQ\n18zaJ4/4Ds+wz+1IJLLVZtaDxKnRML4AutQ+SC4CuitwGjC9gde0AU5O3j8NeDl5/31gcPL+ySnt\n/w5MTJ6yxcx2THnuOqAGuDP5+Bng0to/BMxsYKY4RVqDkpxIODcAQ5LV7G8Bzkp57nXgb8Bc4Kfu\n/pG7Lwf+DCwgcT1rfvoO3f2t5PZFwL0kjpDCuAt4ysxmp2z7M/CKu/9fA6/5EuhnZlXAYSQGhQDc\nBvzAzF4FUqcG/J7EqdoFZvYWicSYahLQwcxuBX5K4hrcAjNbmHwMiVO3fTXwRFqTViEQaQYzuwFY\n6+63tXIcTwK/cvfnWzMOkVyjIzmRPGZmXc3sHRLXEZXgRNLoSE5ERAqWjuRERKRgKcmJiEjBUpIT\nEZGCpSQnIiIFS0lOREQKlpKciIgUrP8fF9OF355UUpoAAAAASUVORK5CYII=\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_overlap([\n",
        "    (\"Ada-DPALS ($\\mu = 1/3$)\", model20m_eps1_ada3, 2),\n",
        "    (\"DPALS (tail)\", model20m_eps1_tail, 5),\n",
        "    (\"DPALS (uniform)\", model20m_eps1_unif, 6),\n",
        "], baseline_20m, ylim=[0, 0.6])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "_Vx9baZ-IOfp"
      },
      "outputs": [],
      "source": [
        "# Nearest neighbors (used in the paper)\n",
        "seed = \"Shawshank Redemption\" #@param [\"Shawshank Redemption\", \"Pinocchio\", \"Nausica\", \"Harry Potter and the Half-Blood Prince\", \"Interstellar\"]\n",
        "latex = False #@param {\"type\": \"boolean\"}\n",
        "models = {\n",
        "    \"ALS\": baseline_20m,\n",
        "    \"DPALS (tail)\": model20m_eps1_tail,\n",
        "    \"Ada-DPALS\": model20m_eps1_ada3,\n",
        "}\n",
        "\n",
        "for label, model in models.items():\n",
        "  print(f\"======================================= {label} =======================================\")\n",
        "  v = Visualizer(model)\n",
        "  x = v.nearest_neighbors(\n",
        "      seed, cosine=True, k=7,\n",
        "      latex=latex, latex_cols=[\"\", \"title\", \"genres\", \"num_ratings\"])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iMvP4cD54aho"
      },
      "source": [
        "### $\\epsilon = 5$"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "9FV0YexG4b97"
      },
      "outputs": [],
      "source": [
        "def train_20m_eps5(method, max_norm, reg, unobs, weight_exp=0):\n",
        "  return train_20m(\n",
        "      method=method, max_norm=max_norm, reg=reg, unobs=unobs,\n",
        "      weight_exp=weight_exp, budget=100, steps=4, count_stddev=40, epsilon=5)\n",
        "\n",
        "model20m_eps5_tail = train_20m_eps5(method=\"tail\", reg=30, unobs=0.2, max_norm=0.1)\n",
        "model20m_eps5_unif = train_20m_eps5(method=\"uniform\", reg=40, unobs=0.4, max_norm=0.1)\n",
        "model20m_eps5_ada1 = train_20m_eps5(method=\"adaptive_weights\", weight_exp=-1, reg=10, unobs=0.4, max_norm=0.05)\n",
        "model20m_eps5_ada2 = train_20m_eps5(method=\"adaptive_weights\", weight_exp=-1/2, reg=30, unobs=0.3, max_norm=0.1)\n",
        "model20m_eps5_ada3 = train_20m_eps5(method=\"adaptive_weights\", weight_exp=-1/3, reg=40, unobs=0.3, max_norm=0.15)\n",
        "model20m_eps5_ada4 = train_20m_eps5(method=\"adaptive_weights\", weight_exp=-1/4, reg=40, unobs=0.3, max_norm=0.2)\n",
        "model20m_eps5_ada0 = train_20m_eps5(method=\"adaptive_weights\", weight_exp=0, reg=50, unobs=0.3, max_norm=0.2)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 334
        },
        "executionInfo": {
          "elapsed": 40528,
          "status": "ok",
          "timestamp": 1680919644292,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "DxH-EufIZOXg",
        "outputId": "2301c414-08a0-4c2a-b578-056a3930138f"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nemWGqNSKAAAAAElFTkSuQmCC\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_recall([\n",
        "    (\"AdaDPALS ($\\mu=1$)\",   model20m_eps5_ada1, 0),\n",
        "    (\"AdaDPALS ($\\mu=1/2$)\", model20m_eps5_ada2, 1),\n",
        "    (\"AdaDPALS ($\\mu=1/3$)\", model20m_eps5_ada3, 2),\n",
        "    (\"AdaDPALS ($\\mu=1/4$)\", model20m_eps5_ada4, 3),\n",
        "    (\"AdaDPALS ($\\mu=0$)\",   model20m_eps5_ada0, 4),\n",
        "    (\"DPALS (tail)\",         model20m_eps5_tail, 5),\n",
        "    (\"DPALS (uniform)\",      model20m_eps5_unif, 6),\n",
        "], num_buckets=5, scale_k=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "m1J-i2yzZmuE"
      },
      "source": [
        "### $\\epsilon=20$"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "0KsyjHfIT8tt"
      },
      "outputs": [],
      "source": [
        "def train_20m_eps20(method, max_norm, reg, unobs, weight_exp=0):\n",
        "  return train_20m(\n",
        "      method=method, max_norm=max_norm, reg=reg, unobs=unobs,\n",
        "      weight_exp=weight_exp, budget=100, steps=5, count_stddev=10, epsilon=20)\n",
        "\n",
        "model20m_eps20_tail = train_20m_eps20(method=\"tail\", reg=30, unobs=0.2, max_norm=0.1)\n",
        "model20m_eps20_unif = train_20m_eps20(method=\"uniform\", reg=30, unobs=0.2, max_norm=0.1)\n",
        "model20m_eps20_ada1 = train_20m_eps20(method=\"adaptive_weights\", weight_exp=-1, reg=20, unobs=0.2, max_norm=0.2)\n",
        "model20m_eps20_ada2 = train_20m_eps20(method=\"adaptive_weights\", weight_exp=-1/2, reg=30, unobs=0.2, max_norm=0.2)\n",
        "model20m_eps20_ada3 = train_20m_eps20(method=\"adaptive_weights\", weight_exp=-1/3, reg=30, unobs=0.1, max_norm=0.2)\n",
        "model20m_eps20_ada4 = train_20m_eps20(method=\"adaptive_weights\", weight_exp=-1/4, reg=30, unobs=0.1, max_norm=0.2)\n",
        "model20m_eps20_ada0 = train_20m_eps20(method=\"adaptive_weights\", weight_exp=0, reg=30, unobs=0.1, max_norm=0.2)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 334
        },
        "executionInfo": {
          "elapsed": 73896,
          "status": "ok",
          "timestamp": 1680921053703,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "qJ6DXClXZUdE",
        "outputId": "c0320049-1bb6-4ec8-f2ef-adfc9c836fc5"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbkAAAE9CAYAAACWdRzmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAABIrklEQVR4nO3de1yVZbr4/88lCkpYHhCnZPKQaQgiHmqcEoUiM6eXouaguTNH\nm7abqNTvd+bX1NRos53abYdmHLf5tcmdNQrNrtBytCZHaMjUFCG3hSbjyGA5GcxIECIC9+8PYMVi\nHYG1WAeu9+u1XvE8z73uda07fC6e03WLMQallFIqGPXwdQBKKaWUt2iSU0opFbQ0ySmllApamuSU\nUkoFLU1ySimlgpYmOaWUUkGrp68DaK/IyEgzbNgwX4fRaV9//TVXXHGFr8PwazpGrukYOafj41qw\njFFBQUG5MWZQ2/UBl+SGDRvGkSNHfB1Gp+Xl5ZGUlOTrMPyajpFrOkbO6fi4FixjJCKl9tbr6Uql\nlFJBS5OcUkqpoKVJTimlVNAKuGty9ly+fJmzZ89SW1vr61DcdtVVV1FcXOzrMPxaZ8eod+/eREdH\n06tXLw9GpZQKJEGR5M6ePUvfvn0ZNmwYIuLrcNxSVVVF3759fR2GX+vMGBljqKio4OzZswwfPtzD\nkSmlAkVQnK6sra1l4MCBAZPglPeJCAMHDgyoo3ullOcFRZIDNMEpG/o7oZQKmiSnlFJKtaVJTiml\nVNDSJOdhOTk5iAgnTpywu3316tWsW7fOZT8hISEkJCQQGxvLuHHjyMzMpLGx0WZ7XFwc8+fPp6am\nxmkMERERdj9n7dq1xMbGEh8fT0JCAocOHbJpc/HiRaZNm0ZDQ4PLuNtr6dKlREVFERcXZ1lXV1fH\n1KlTqa+v9/jnKaW6l6C4u7Kt6x7b7dH+/vKLmW63zcrKYsqUKWRnZ7N69eoOf2afPn0oKioC4Pz5\n89xzzz1UVlayZs0am+2LFi1i06ZNrFq1ql0xHDhwgF27dnH06FHCwsIoLy+nrq7Opt2WLVuYO3cu\nISEhHf4+jixZsoSMjAwWL15sWRcaGsptt93G66+/zv333+/xz1RKdR96JOdB1dXV7N+/nxdffJHs\n7GzL+rVr1zJ69GhSUlI4efKk1XtSU1OZOHEisbGxbN682W6/UVFRbN68mQ0bNmCMsdmemJhISUmJ\n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\nyw033AA0JfZBgwa5Nf+cUspztHZlN5OVlcWcOXOs1s2bN4/s7GzS0tJISEhg3rx5JCYmWrbPmDGD\n+vp64uPjeeKJJ5g8ebJlW8vpyNjYWFJSUpg+fbrl1vn2xrB9+3ZqamqIjo62vDIzM6murua+++5j\nzJgxxMfH88knn9i9G3P69OmWRFlUVERjYyPjxo3jqaeeIiYmhq1bt7Z3uCwWLlzId7/7XU6ePEl0\ndDQvvvgie/bsYcaMGZY2586dIzk5mfj4eG688UZuv/127rrrLqApIc6cObPDn6+U6phAqV0ZlKcr\n23PLv6fk5eXZrHv44YctPz/++ONW26qqqggLC2PPnj12+3P1TFp1dXW7Ynj++eft9vPBBx84/RyA\njIwMMjMzSUlJ4dixYxQWFnrs+ldWVpbNugkTJvDcc89Zjhjj4+MpLLT/F9/27dt5+umnPRKLUsp9\n9h4XcJfWrlR+Zfz48SQnJ1NZWUmPHj28foPH0aNH3Tr9WFdXR2pqKqNHj/ZqPEopW1q7UgWVpUuX\nctVVV/Hpp5/6OhSL0NBQuw+RK6W6htauVEopFdS0dqVSSqmg5s+1KzXJKaWU6jRHic7Xpb00ySml\nlPIIf6xdGZSPECillPKN1onu1R6faO1KpZRSwcWfalfq6UqllFIep7UrlVJKBSytXdlN5eTkICKc\nOHHC7vbVq1ezbt06l/2EhIRYaleOGzeOzMxMGhsbbbbHxcUxf/58ampqnMbQMuloW2vXriU2Npb4\n+HgSEhI4dOiQTZuLFy8ybdo0l6XGOmLp0qVERUXZnXj1kUceYf/+/ZblhoYGxo8fb6lbWVdXx9Sp\nU6mvr/d4XEop57R2pQ8Vx3Z8pmp7Yj4+7nbbrKwspkyZQnZ2tt1ix+5qPZXO+fPnueeee6isrGTN\nmjU22xctWsSmTZtYtWpVu2I4cOAAu3bt4ujRo4SFhVFeXk5dXZ1Nuy1btjB37lxCQkI6/H0cWbJk\nCRkZGXYrlxw5coQXXnjBsvzrX/+amJgYvvrqK6Cp4sltt93Gq6++yqJFizwem1LKMa1dCYjIDBE5\nKSIlIvKok3Y3ikiDiNztzXi8rbq6mv379/Piiy+SnZ1tWb927VpGjx5NSkoKJ0+etHpPamoqEydO\nJDY2ls2bN9vtNyoqis2bN7NhwwariVNbJCYmUlJS4jQGe86dO0dkZCRhYWEAREZGcs0119i027Zt\n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\niiuuYOLEifz1r3/FGMNrr73GSy+9xB//+EeH0+y0OHfuHNHR0ZZle9X/AV5//XVmzJhBXV0dTz75\nJK+++ioJCQm8+uqrfPjhh9x8882MHz+em2++2TLDd15eHnfddZdNX+Hh4QwbNowPP/ywvcOglApy\n7d1/au1KD2nvwHsj0TmaybuiooKDBw8SExPD/v37GT58ONdddx1JSUkuj7hWrlzJrbfeyp133slz\nzz3HhQsXbNr89a9/pX///oSFhREaGspTTz1FWloaRUVFpKWlccMNN/DnP/+ZwsJCnnrqKR577DGX\n32XSpEluTYKqlOp+tHalj/hDomt9FJefn8/48eOZPn06jz76KDExMWRlZbFgwQLgm1m8nfnBD35A\ncXEx8+fPJy8vj8mTJ3Pp0iWrNufOnWPQoEEO+6isrGT+/PnExcWxcuVKPv74Y5ffIyoqis8//9xl\nO6VU96S1K33El4mu7UzeLdfkCgoKWL58OQ0NDbz++us89dRTDBs2jIceeog9e/bYnU27tWuuuYal\nS5eyc+dOevbsyfHjx622t53Ju60nnniC5ORkjh8/zltvveXyFClAbW0tffr0ceNbK6W6K61d6SO+\nSHTuzOSdm5vLuHHjKCsr48yZM5SWljJv3jx27NjhsN+3336by5cvA/D3v/+diooKhgwZYtVm1KhR\nnDlzxrLct29fq8RZWVlpec9LL73k1vf59NNPiYuLc6utUqr70tqVXcTeLf8b29lHe9u3zOTd8gjB\nvffea3lMwJ7XXnvN7izezz//PPfee69lJu8Wq1at4uzZszzyyCP07t0bgP/8z//kW9/6llUfV1xx\nBddddx0lJSWMHDmS5ORknnnmGRISEvjJT37Cj3/8Y+677z4yMzO59dZb3fpu+/fvdzkruVJKgdau\nDFrOZvJOSkoiKSnJat2mTZtsJh+dNWsWs2bNAqCxsdFuX5mZmS5jycjI4KWXXuLf//3fGTBgAIcP\nH7ba3npOuJ///Oc2MS5ZsoQlS5YATc/xxcbGEhnZvudglFLdlz/VrtQkF4TmzJlDRUWFR/oqLy+3\nJEKllHJXwNWuFJFhdtbd6NFolMfcf//9Hunn9ttvZ9iwYR7pSykVPIKxduUbImK5y0FEpgFbPB+S\nUkopfxcotSvbk+T+FdghIt8SkZnArwHnBRGVUkoFpc7che6XtSuNMYeBh4E/AquB240xZV6KSyml\n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\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_recall([\n",
        "    (\"AdaDPALS ($\\mu=1$)\",   model20m_eps20_ada1, 0),\n",
        "    (\"AdaDPALS ($\\mu=1/2$)\", model20m_eps20_ada2, 1),\n",
        "    (\"AdaDPALS ($\\mu=1/3$)\", model20m_eps20_ada3, 2),\n",
        "    (\"AdaDPALS ($\\mu=1/4$)\", model20m_eps20_ada4, 3),\n",
        "    (\"AdaDPALS ($\\mu=0$)\",   model20m_eps20_ada0, 4),\n",
        "    (\"DPALS (tail)\",         model20m_eps20_tail, 5),\n",
        "    (\"DPALS (uniform)\",      model20m_eps20_unif, 6),\n",
        "], num_buckets=5, scale_k=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1JmDuel67ShF"
      },
      "source": [
        "## ML10M"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "2HigN2jaSCDz"
      },
      "source": [
        "### Non-private baseline"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 459
        },
        "executionInfo": {
          "elapsed": 201690,
          "status": "ok",
          "timestamp": 1681311139175,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "PERI3ONHsR4D",
        "outputId": "3440fb0e-cf86-4fec-fda3-6a831b283fcc"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEvCAYAAABL4wrUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAAAz4ElEQVR4nO3deXgc1Zn2/+/T3dpXW8LCtiTL2GYxXsEQzCoDjm1wgMwQMJBc\nCZCXIWGfwABvZmAgZIZfVpJAYEhewiQheAhZgITFBCxMJqwmxmvAa7C8S960Sy2d3x/VkltSS2rZ\nklrdfX+uq6/uqjrVetrLXaVTp0+Zcw4REUlcvlgXICIig0tBLyKS4BT0IiIJTkEvIpLgFPQiIglO\nQS8ikuACsS4gksLCQldWVhbrMjqpq6sjKysr1mVERbUOnniqN55qhfiqdzjWunz58irn3FGRtg3L\noC8rK+P999+PdRmdVFRUUF5eHusyoqJaB0881RtPtUJ81TscazWzv/e0TV03IiIJTkEvIpLgFPQi\nIgluWPbRi0j8aGlpobKyksbGxiN6n7y8PNatWzdAVQ2uWNaanp5OcXExKSkpUe+joBeRI1JZWUlO\nTg5lZWWY2WG/T01NDTk5OQNY2eCJVa3OOaqrq6msrGT8+PFR76euGxE5Io2NjRQUFBxRyEt0zIyC\ngoJ+//akoBeRI6aQHzqH82etoBcRSXAKehFJOtnZ2QBs376dSy+9NGKb8vLyXr+4WVZWxtSpU5k2\nbRrnnHMOf//7oe8rmRlf+MIXOpaDwSBHHXUUCxcuBGDXrl0sXLiQ6dOnM3nyZC644AIAtmzZQkZG\nBjNmzOh4/PznPz/iz5swF2Pb2hy/++s2xh+VxUmlI2JdjojEgTFjxvDss88e9v5Lly6lsLCQe++9\nlwceeICf/OQnAGRlZbF69WoaGhrIyMjg1VdfZezYsR373XPPPcydO5dbbrkFgJUrV3ZsmzBhAitW\nrDjsmiJJmDN6M7j3+TU8v2J7rEsRkSF255138uMf/7hj+d///d+57777OO+88zjppJOYOnUqzz33\nXLf9tmzZwpQpUwBoaGhg0aJFTJs2jcsvv5yGhoaof/7s2bPZtm1bp3ULFizgj3/8IwBPP/00V1xx\nRce2HTt2UFxc3LE8bdq0qH/W4UiYM3ozo3hEBpX7ov/LEZGBdd8La1i7/eBh7dva2orf7++2fvKY\n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\n",
            "text/plain": [
              "\u003cFigure size 600x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "step 15:\n",
            "|-----------------|--------|\n",
            "| valid_RMSE      | 0.7816 |\n",
            "| valid_RMSE_user | 0.7816 |\n",
            "| test_RMSE       | 0.7772 |\n",
            "| test_RMSE_user  | 0.7772 |\n",
            "\n",
            "Training took 4.69s per sweep, 6.74s per eval\n"
          ]
        }
      ],
      "source": [
        "# Basline (non-private) RMSE: 0.777 on test\n",
        "wals_10m = DPALSModel(\n",
        "    ml10m, binarize=False, embedding_dim=64, init_stddev=0.1,\n",
        "    regularization_weight=80, row_reg_exponent=1, col_reg_exponent=1,\n",
        "    unobserved_weight=0.0, batch_size=2000)\n",
        "wals_10m.train(num_steps=15, plot_metrics=RMSE_METRICS, num_eval_points=15)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "wRwvGNy47Vfh"
      },
      "outputs": [],
      "source": [
        "def train_10m(\n",
        "    method, max_norm, steps, reg, epsilon, count_stddev, budget=100,\n",
        "    weight_exp=0, reg_exponent=0.25, dim=32):\n",
        "  item_frac = 1\n",
        "  delta = 1e-5\n",
        "  sanitizer = Sanitizer(\n",
        "      budget=budget, method=method, weight_exponent=weight_exp, center=True,\n",
        "      item_frac=item_frac, count_stddev=count_stddev, count_sample=budget)\n",
        "  optimizer = DPALSOptimizer(budget=budget, max_norm=max_norm)\n",
        "  accountant = DPALSAccountant(sanitizer, optimizer, steps=steps)\n",
        "  accountant.set_sigmas(\n",
        "      target_epsilon=epsilon, target_delta=delta, sigma_ratio0=np.inf,\n",
        "      sigma_ratio1=1)\n",
        "  dpals_10m = DPALSModel(\n",
        "      ml10m, binarize=False, embedding_dim=dim, init_stddev=0.1,\n",
        "      regularization_weight=reg, row_reg_exponent=reg_exponent,\n",
        "      col_reg_exponent=reg_exponent, unobserved_weight=0.0, sanitizer=sanitizer,\n",
        "      optimizer=optimizer, batch_size=2000)\n",
        "  dpals_10m.train(num_steps=steps, compute_metrics=False)\n",
        "  return dpals_10m\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cgVnodsn8nw8"
      },
      "source": [
        "### $\\epsilon = 1$"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "WX4dixoI8pzi"
      },
      "outputs": [],
      "source": [
        "def train_10m_eps1(method, max_norm, reg, reg_exponent=0.25, weight_exp=0):\n",
        "  return train_10m(\n",
        "      method=method, max_norm=max_norm, reg=reg, reg_exponent=reg_exponent,\n",
        "      weight_exp=weight_exp, dim=8, steps=2, count_stddev=200, epsilon=1)\n",
        "\n",
        "model10m_eps1_tail = train_10m_eps1(reg=60, max_norm=0.2, method=\"tail\")\n",
        "model10m_eps1_unif = train_10m_eps1(reg=60, max_norm=0.2, method=\"uniform\")\n",
        "model10m_eps1_ada1 = train_10m_eps1(reg=30, max_norm=0.1, method=\"adaptive_weights\", weight_exp=-1, reg_exponent=0)\n",
        "model10m_eps1_ada2 = train_10m_eps1(reg=40, max_norm=0.2, method=\"adaptive_weights\", weight_exp=-1/2)\n",
        "model10m_eps1_ada3 = train_10m_eps1(reg=40, max_norm=0.2, method=\"adaptive_weights\", weight_exp=-1/3)\n",
        "model10m_eps1_ada4 = train_10m_eps1(reg=40, max_norm=0.2, method=\"adaptive_weights\", weight_exp=-1/4)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 338
        },
        "executionInfo": {
          "elapsed": 75642,
          "status": "ok",
          "timestamp": 1680923059277,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "DiS2EkgYDe2t",
        "outputId": "d573ea1a-a775-4c2d-c525-97e85f0edb68"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nFrIkZ4z5GPibxfEKc/7/7EWAu5ZDuEAaz6JsLk1wSgVnw4YNjB49mn79+tG1a1d27dpFQUEBOTk5\nFBYW8uabb7Jz506f56xevZqCggLy8/NZvnw5paWlfvvu27cvtbW1nDx50md/dXU1mzZt8qzp5m8M\ngYwaNYpjx47Rr18/5syZw0cffdSkTVVVFUeOHKFPnz6efcXFxVx77bVA3crg/taTy8jIIC0trcnP\n5s2bA47H26ZNmxg9+vy1z7x583j++ec9K5I3SElJaRLTlgrr7EoRGQ88C/QA/s6i3SxgFkDPnj3J\nzc29IOMDoJ/zz7BmxcU5alfV6TK+nDPHUdte8XH0AoZNmU5pRSXdEuLp0L7p/7YDcWVN9lVUVfL1\nZbX8buQqEuLiOUBdm+ILGb8WqqiouLD/n10o2mN0ySWX+F2FurU47fuVV15hzpw5lJeXM27cONas\nWcMVV1zBmDFjPKt0jx49mrNnz3r6/NWvfsXGjRsBOHbsGEVFRdxwww1+X9cYQ0VFBfHx8Zw+fdqz\nQveNN97I3XffTXl5ud8xNCQkf79Hbm4un3zyCR9//DF33303ixYt8rn1d+LECS6++GLPc//85z9z\n+eWX8/333wPw2Wef0b9//yZ9v/fee47jWVFRQW1trc/+d999l9/85jeUl5ezadMmunTpQr9+/cjL\ny6O6utqnbfv27fn666/9ro5w5swZx//2w5rkjDHrgfUiMpy6z+f8Li9rjFkFrIK69eQu6BpaiyY4\nbjrP4VI7zVlPblNqX8/j4m9KeCLAZ3Q3J/3CZ9v7Cu6Hva/wOZY4LfLLekX7WmmtIdpjdODAgZAu\n/+Kk79LSUj7++GMOHjyIiHiS2vz58+nYsaOnj7i4ODp06EDnzp3Jzc0lLy+PHTt2EB8fT2ZmJrGx\nsZ623q975MgRYmNj6du3LyJCp06d2L17t6MxLFu2zPL3GDNmDGPGjCE9PZ01a9Ywe/Zsz7Hq6mqq\nqqo8z92/fz+DBw/2bO/bt4/Jkyc36TsjI8NvUl2yZEmT1cETEhJ8lvCprKykoqKCfv36AXUrH7z/\n/vts3ryZM2fO8N133/H3f//3vPrqq0Dd1Wag1cE7duzI4MHO7kxFxOzK+lubV4tIcLMropzTW5d6\ni1Kp1vH6668zffp0vvzyS44ePcqxY8dISkpiyJAhrF+/ntOnT1NeXs4777zjeU5ZWRmXXnop8fHx\n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\ntnBS9gAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_rmse([\n",
        "    (\"AdaDPALS ($\\mu=1$)\",   model10m_eps1_ada1, 0),\n",
        "    (\"AdaDPALS ($\\mu=1/2$)\", model10m_eps1_ada2, 1),\n",
        "    (\"AdaDPALS ($\\mu=1/3$)\", model10m_eps1_ada3, 2),\n",
        "    (\"AdaDPALS ($\\mu=1/4$)\", model10m_eps1_ada4, 3),\n",
        "    (\"DPALS (tail)\",         model10m_eps1_tail, 5),\n",
        "    (\"DPALS (uniform)\",      model10m_eps1_unif, 6),\n",
        "], item_frac = 1.0, num_buckets = 5, ylim=[0.75, 1.5])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "toGGiisCpipP"
      },
      "source": [
        "### $\\epsilon = 5$"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "D7QdwRwNpiDV"
      },
      "outputs": [],
      "source": [
        "def train_10m_eps5(method, max_norm, reg, reg_exponent=0.25, weight_exp=0):\n",
        "  return train_10m(\n",
        "      method=method, max_norm=max_norm, reg=reg, reg_exponent=reg_exponent,\n",
        "      weight_exp=weight_exp, dim=32, steps=3, count_stddev=40, epsilon=5)\n",
        "\n",
        "model10m_eps5_tail = train_10m_eps5(reg=40, max_norm=0.5, method=\"tail\")\n",
        "model10m_eps5_unif = train_10m_eps5(reg=40, max_norm=0.5, method=\"uniform\")\n",
        "model10m_eps5_ada1 = train_10m_eps5(reg=40, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1, reg_exponent=0)\n",
        "model10m_eps5_ada2 = train_10m_eps5(reg=60, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1/2)\n",
        "model10m_eps5_ada3 = train_10m_eps5(reg=60, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1/3)\n",
        "model10m_eps5_ada4 = train_10m_eps5(reg=60, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1/4)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 338
        },
        "executionInfo": {
          "elapsed": 65804,
          "status": "ok",
          "timestamp": 1680924729210,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "vqn7m0n000f3",
        "outputId": "afecc3e7-e2b9-468f-f0ef-d3287551c1cc"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbkAAAFBCAYAAADqldFcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAABHnElEQVR4nO3df3hU9Zn//+edQAIxKAKCSioEFMSEECBarAYTRYqsl/wSAalI\n8RdraQt81v1Y96uCLepalrVcrOVDC4qKibsqqCjaUolGRJSQyK+ARIqCUjHpEpMmEJK8v38kGWaS\nmXNOkhlmzuR+XFcuMzPvnHnnJTn3nDNn7rcYY1BKKaWiUUy4J6CUUkqFihY5pZRSUUuLnFJKqail\nRU4ppVTU0iKnlFIqammRU0opFbVCVuREZI2IHBeRPQEezxKRchEpavx6JFRzUUop1TF1CuG2nwNW\nAM9bjMk3xtwcwjkopZTqwEJ2JGeM+QD4e6i2r5RSStkJ93tyV4vIZyKySURSwjwXpZRSUSaUpyvt\n7AT6GWMqRWQ8sAG4zN9AEbkXuBega9euI3/wgx+ctUmGQn19PTEx4X59Edk0I3uakTOak71oyOjz\nzz8vNcZc0Px+CWXvShHpD2w0xqQ6GHsYyDDGlFqNy8jIMDt27AjOBMMkLy+PrKyscE8jomlG9jQj\nZzQne9GQkYgUGGMymt8fttItIheKiDR+f1XjXMrCNR+llFLRJ2SnK0UkB8gCeonIUeBRoDOAMWYl\ncCvwzyJSC1QD040uiaCUUiqIQlbkjDEzbB5fQcNHDJRSSqmQCOeFJ0opFdDp06c5evQoJ0+ebNd2\nzjvvPIqLi4M0q+jkpoy6dOlCUlISnTt3djRei5xSKiIdPXqUbt260b9/fxrfvm+TiooKunXrFsSZ\nRR+3ZGSMoaysjKNHj5KcnOzoZ9x9zahSKmqdPHmSnj17tqvAqegiIvTs2bNVR/da5JRSEUsLnGqu\ntf8mtMgppZSKWlrklFJKRS0tckopZWP9+vWICPv37/f7+KJFi1i6dKntdmJjY0lPTyclJYVhw4ax\nbNky6uvrWzyemprK1KlTqaqqspxDYmKi3+dZsmQJKSkppKWlkZ6ezvbt21uMqa6u5rrrrqOurs52\n3q01Z84cevfuTWrqmWZXNTU1jB49mtra2qA/nxW9ulIp5QoDH3q7bT9oDPh5H+eLx8c73kROTg7X\nXnstubm5LFq0qG3zALp27UpRUREAx48f5/bbb6e8vJzFixe3eHzmzJmsXLmShQsXtmoO27ZtY+PG\njezcuZP4+HhKS0upqalpMW7NmjVMnjyZ2NjYNv8+gcyePZt58+Yxa9Ysz31xcXHccMMNvPzyy8yc\nOTPozxmIHskppZSFyspKtm7dyurVq8nNzfXcv2TJEgYPHsyYMWM4cOCAz89MnDiRkSNHkpKSwqpV\nq/xut3fv3qxatYoVK1bgr9lTZmYmJSUllnPw59ixY/Tq1Yv4+HgAevXqxcUXX9xi3Lp165gwYYLn\ndlZWluf3KCsr8zkKa63Ro0fTo0ePFvdPnDiRdevWtXm7baFFTimlLGzYsIFx48YxaNAgevTowc6d\nOykoKCA3N5fCwkJee+01Pv30U5+fWbNmDQUFBezYsYPly5dTVua/Le+AAQOor6/n+PHjPvfX1tay\nadMmhg4dGnAOgYwdO5YjR44waNAg7r//ft5///0WY2pqajh06BD9+/f33FdSUsJllzUsBLNr1y7P\nc3vLzMwkPT29xdfmzZsDzsdbampqi6xCTU9XKqWUhZycHObPnw/A9OnTycnJoW/fvkyaNImEhAQA\nbrnlFp+fWb58OevXrwfgyJEjHDx4kJ49e/rdvvdRXHV1Nenp6UBDQbnrrrsCzmHEiBF+t5eYmEhB\nQQH5+fls2bKFadOm8eSTTzJ79mzPmNLSUrp37+65/dVXX9G3b1/Pcju7du0iLS2txbbz8/P9PqdT\nsbGxxMXFndUPn2uRU0qpAMrKynjvvffYs2cPIkJdXR0iwoIFCwJ+XisvL4/Nmzezbds2EhISyMrK\nCvjh5UOHDhEbG0vv3r0B3/fk7Obw1FNPBZx3bGwsWVlZZGVlMXToUNauXetT5Lp27eozp927d/sU\ntYKCAqZNm9Ziu5mZmVRUVLS4f+nSpYwZMybgfLydOnWKLl26OBobDHq6UimlAnjllVeYNWsWX375\nJYcPH+bIkSMkJyczYsQI1q9fT3V1NRUVFbz55puenykvL+f8888nISGB/fv38/HHH/vd9nfffcfc\nuXOZN2+e5QecA83hww8/9Dv+wIEDHDx40HO7qKiIfv36+Yw5//zzqaur8xS63bt3e74/ePAgr7/+\nut/Tlfn5+RQVFbX4clrgysrKuOCCCxz3nQwGLXJKKRVATk4OkyZN8rlvypQp5ObmMm3aNNLT05ky\n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\nsWM9l863dg4vvfQSVVVVJCUleb6WLVtGZWUld955J1dccQVpaWns27fP79WYY8eO9RTK3bt3U19f\nz7Bhw3jssccYMmQIa9eubW1cHjNmzODqq6/mwIEDJCUlsXr16hbvxx07dozs7GzS0tK48sorufHG\nG7n55puBhoI4fvz4Nj+/N/F3VU8ky8jIMDt27Aj3NNolLy+PrKwsR2MTu8Qz60cjubRPL8txtyU/\nYPm493t2U9f9wulUw6Y1GXVU0Z5RcXExQ4YMafd2gvG+TjQqLCxk2bJlvPDCCwwYMIDPPvsspDmN\nGDGC7du3Ozo6mzx5Mk888UTA1cH9/dsQkQJjTEbzsXokF+Fm/Wgkz39U4OiILhC9KEUp1dzw4cPJ\nzs6mvLycmJiYkL8Q2Llzp6MCV1NTw8SJEwMWuNbSC08iXNN7bs9/VODoiK45LXBnHH2o5ZVhgfJJ\nejyzxVilos2cOXOAhqO6SBEXF+f3Q+RtpUdyLuBd6FpzRKcFzprmo1T00yLnEq0tdLoDt6b5KNUx\naJFzEaeFTnfg1jQfpToOLXIuY1fodAduTfNRqmPRIudCgQqd7sCtaT5KdTxa5FyqeaHTHbg9zUep\njkc/QuBi3oXu5Zh9ugO30ZrWZ1PRjxAoFQ30SM7ltHelc9r6TKmOR4tchNPelWeP9ylfpbytX78e\nEWH//v1+H1+0aBFLly613U5sbKynd+WwYcNYtmwZ9fX1LR5PTU1l6tSpVFVVWc6hadHR5pYsWUJK\nSgppaWmkp6ezffv2FmOqq6u57rrrqKurs513a82ZM4fevXv7XXj1vvvuY+vWrZ7bdXV1DB8+3NO3\nsqamhtGjR1NbWxuUuYTsdKWIrAFuBo4bY1r8piIyAfg1UA/UAvONMf7bandgbe100pzuwK3pe5qR\nrzil7StV+zNk7x7HY3Nycrj22mvJzc312+zYKe+ldI4fP87tt99OeXk5ixcvbvH4zJkzWblyJQsX\nLmzVHLZt28bGjRvZuXMn8fHxlJaWUlNT02LcmjVrmDx5MrGxsW3+fQKZPXs28+bN89u5ZPv27Tzz\nzDOe27/73e8YMmQI33//PdDQ8eSGG27g5ZdfZubMme2eSyiP5J4Dxlk8/hdgmDEmHZgD/DGEc3Et\n7V0ZepqPslJZWcnWrVtZvXo1ubm5nvuXLFnC4MGDGTNmDAcOHPD5mYkTJzJy5EhSUlJYtWqV3+32\n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\nGZucnMzQoUOJiYkhJSWFG264ARFh6NChPs8TScv4hPLCk+eAFcDzAR7/K3CdMeZ/ReQmYBXwwxDO\nx5W0d6U9zSd4/F3cESifpMczz+bUbOdjOX5DcP7/ei+1U1xcTGZmps9puaaldt544w2WLFmCMYay\nsjLbJtFNS+3MmTOH1NRU9uzZw8iRZ84+NF9qp1OnTj7vkXk/1rlzZ88qCbGxsdTW1lr+Ts1PvXo7\n55xzfG57H0nGxMR4bsfExPg8TyQt4xOyIzljzAfA3y0e/8gY87+NNz8GkgKN7ci0d6U9zSd0Ii2f\ncBa4SFpqp3///hQVFVFfX8+RI0c874e1xejRo3nrrbeoqqriH//4B+vXryczs30vYCJpGZ9I+QjB\nXcCmcE8iUmnvSmuaT2hEWj5Jj2cylUymYn/pf5OpZDKu4qdRt9TONddc4zl1mJqayogRI9r0+wGM\nGDGCmTNnctVVVwEN/TGHDx9ue5rTypYtW3jiiSfa/PPBJFaHqu3euEh/YKMxJmBJF5FsGpaCutYY\nUxZgzL3AvQB9+vQZmZub2+657fn6e0fjUmMOOd7mvrg4R+OS6i8g7vh3jsaWJ5zZ5qnTtZRVVtEz\nMYH4zr6vT3rE+f5RVNZU8dWJb7ik+8UkxiX4PNa5b6Kj5w6nyspKEhOdzfPbv5YA1vmAb0ZW+UD0\nZeTU6a8bPsNllw+EPqPzzjuPSy+9tN3bqaurIzY2NggzCq8333yTwsJCHnkk+BePBTOj48ePc9dd\nd/Hmm28GZXv+lJSUUF5e7nNfdnZ2gTEmo/nYsB7JiUga8EfgpkAFDsAYs4qG9+zIyMgwzddwaou7\nHrK+4qnJF/HOL9SYn3yJo3FPVtxLv2cCLfHoa1PaAJ/bJd+W8rCfI5ZrvDrse78Cv7LfRS22mTQz\nPO+ltEZeXl6LtboCWfb/zqzFFSgfOJORXT4QfRk5dfShfEf5QOgzKi4ubvMRmLf2LJoaSW6//Xaq\nqqpC8rsEM6P9+/fz9NNPhzTzLl26MHy4s7MLYfsIgYhcArwG3GGM+dxuvGqgvRmtaT7to/lEtmAt\ntRNKV155Jenp6eGehkcoP0KQA2wDBovIURG5S0TmisjcxiGPAD2BZ0SkSER2hGou0UZ7M1rTfNou\n0vIJ5dspyp1a+28ilFdXzjDGXGSM6WyMSTLGrDbGrDTGrGx8/G5jzPnGmPTGrxbnUlVgzXfkugP3\n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\nAAAASUVORK5CYII=\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_rmse([\n",
        "    (\"AdaDPALS ($\\mu=1$)\",   model10m_eps5_ada1, 0),\n",
        "    (\"AdaDPALS ($\\mu=1/2$)\", model10m_eps5_ada2, 1),\n",
        "    (\"AdaDPALS ($\\mu=1/3$)\", model10m_eps5_ada3, 2),\n",
        "    (\"AdaDPALS ($\\mu=1/4$)\", model10m_eps5_ada4, 3),\n",
        "    (\"DPALS (tail)\",         model10m_eps5_tail, 5),\n",
        "    (\"DPALS (uniform)\",      model10m_eps5_unif, 6),\n",
        "], item_frac = 1.0, num_buckets = 5, ylim=[0.75, 1.5])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tvkMUJx5rePi"
      },
      "source": [
        "### $\\epsilon = 20$"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "gVm5coodrdyl"
      },
      "outputs": [],
      "source": [
        "def train_10m_eps20(method, max_norm, reg, reg_exponent=0.25, weight_exp=0):\n",
        "  return train_10m(\n",
        "      method=method, max_norm=max_norm, reg=reg, reg_exponent=reg_exponent,\n",
        "      weight_exp=weight_exp, dim=32, steps=4, count_stddev=10, epsilon=20)\n",
        "\n",
        "model10m_eps20_tail = train_10m_eps20(reg=40, max_norm=0.5, method=\"tail\")\n",
        "model10m_eps20_unif = train_10m_eps20(reg=40, max_norm=0.5, method=\"uniform\")\n",
        "model10m_eps20_ada1 = train_10m_eps20(reg=10, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1, reg_exponent=0)\n",
        "model10m_eps20_ada2 = train_10m_eps20(reg=40, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1/2)\n",
        "model10m_eps20_ada3 = train_10m_eps20(reg=40, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1/3)\n",
        "model10m_eps20_ada4 = train_10m_eps20(reg=40, max_norm=0.5, method=\"adaptive_weights\", weight_exp=-1/4)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 338
        },
        "executionInfo": {
          "elapsed": 31588,
          "status": "ok",
          "timestamp": 1680925416281,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "mUlF4bdh5Zpk",
        "outputId": "b6a55c4d-dd21-4cf7-d2c0-a7b5510b4341"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbkAAAFBCAYAAADqldFcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAABEK0lEQVR4nO3df3gU5bn4//dNIEAMioCgkgoBBDEhBIiWqoFEKUaOl/wSAVFU\nVKSKLfD5tMdjvyrYg3Ish2O5+FgOrVRUTOxRAUXRlko0UEQJiYAQSqQoKBWTHkJigJDk+f6RZM0m\nuzOTZJfdnb1f15XLnZlnn3lyG+bemZ25HzHGoJRSSrlRu1APQCmllAoWTXJKKaVcS5OcUkop19Ik\np5RSyrU0ySmllHItTXJKKaVcK2hJTkRWi8hxEdnrZ3uGiJSJSGH9z+PBGotSSqno1D6Ifb8ArABe\ntGiTZ4y5OYhjUEopFcWCdiZnjPkQ+Gew+ldKKaXshPo7uR+JyKcisklEkkI8FqWUUi4TzMuVdnYB\nfYwxFSIyDlgPXO6roYjMBmYDdO7cecQPfvCDczbIYKitraVdu1B/vghvGiN7GiNnNE723BCjv/3t\nbyXGmIuarpdg1q4Ukb7ARmNMsoO2h4E0Y0yJVbu0tDSzc+fOwAwwRHJzc8nIyAj1MMKaxsiexsgZ\njZM9N8RIRPKNMWlN14csdYvIxSIi9a+vrh9LaajGo5RSyn2CdrlSRLKBDKCHiBwFngA6ABhjVgK3\nAj8RkWrgFDDN6JQISimlAihoSc4YM91m+wrqHjFQSimlgiKUN54opZRfZ8+e5ejRo5w+fbpN/Vxw\nwQXs378/QKNyp0iKUadOnUhISKBDhw6O2muSU0qFpaNHj9KlSxf69u1L/df3rVJeXk6XLl0CODL3\niZQYGWMoLS3l6NGjJCYmOnpPZN8zqpRyrdOnT9O9e/c2JTjlLiJC9+7dW3R2r0lOKRW2NMGpplr6\nN6FJTimllGtpklNKKeVamuSUUsrGunXrEBGKiop8bl+4cCFLly617ScmJobU1FSSkpIYOnQoy5Yt\no7a2ttn25ORkpkyZQmVlpeUY4uPjfe5n8eLFJCUlkZKSQmpqKjt27GjW5tSpU4wePZqamhrbcbfU\nrFmz6NmzJ8nJ3xe7qqqqYtSoUVRXVwd8f1b07kqlVETo/+g7rXujMeDje5zPnxrnuIvs7Gyuu+46\ncnJyWLhwYevGAXTu3JnCwkIAjh8/zu23305ZWRmLFi1qtn3GjBmsXLmSBQsWtGgM27dvZ+PGjeza\ntYuOHTtSUlJCVVVVs3arV69m0qRJxMTEtPr38efuu+9m7ty5zJw507MuNjaWG264gVdffZUZM2YE\nfJ/+6JmcUkpZqKioYNu2bTz//PPk5OR41i9evJhBgwYxZswYDhw44PWeCRMmMGLECJKSkli1apXP\nfnv27MmqVatYsWIFvoo9paenU1xcbDkGX44dO0aPHj3o2LEjAD169ODSSy9t1m7t2rWMHz/es5yR\nkeH5PUpLS73Owlpq1KhRdOvWrdn6CRMmsHbt2lb32xqa5JRSysL69evJyspi4MCBdOvWjV27dpGf\nn09OTg4FBQW88cYbfPLJJ17vWb16Nfn5+ezcuZPly5dTWuq7LG+/fv2ora3l+PHjXuurq6vZtGkT\nQ4YM8TsGf8aOHcuRI0cYOHAgDz74IB988EGzNlVVVRw6dIi+fft61hUXF3P55XUTwezevduz78bS\n09NJTU1t9rN582a/42ksOTm5WayCTS9XKqWUhezsbObNmwfAtGnTyM7Opnfv3kycOJG4uDgAbrnl\nFq/3LF++nHXr1gFw5MgRDh48SPfu3X323/gs7tSpU6SmpgJ1CeXee+/1O4bhw4f77C8+Pp78/Hzy\n8vLYsmULU6dOZcmSJdx9992eNiUlJXTt2tWz/OWXX9K7d2/PdDu7d+8mJSWlWd95eXk+9+lUTEwM\nsbGx5/Thc01ySinlR2lpKe+//z579+5FRKipqUFEmD9/vt/ntXJzc9m8eTPbt28nLi6OjIwMvw8v\nHzp0iJiYGHr27Al4fydnN4ZnnnnG77hjYmLIyMggIyODIUOGsGbNGq8k17lzZ68x7dmzxyup5efn\nM3Xq1Gb9pqenU15e3mz90qVLGTNmjN/xNHbmzBk6derkqG0g6OVKpZTy47XXXmPmzJl88cUXHD58\nmCNHjpCYmMjw4cNZt24dp06dory8nLfeesvznrKyMi688ELi4uIoKirio48+8tn3t99+y5w5c5g7\nd67lA87+xrB161af7Q8cOMDBgwc9y4WFhfTp08erzYUXXkhNTY0n0e3Zs8fz+uDBg2zYsMHn5cq8\nvDwKCwub/ThNcKWlpVx00UWO604GgiY5pZTyIzs7m4kTJ3qtmzx5Mjk5OUydOpXU1FQmT55Menq6\nZ3tWVhbV1dWkpKTw2GOPMXLkSM+2hsuRSUlJjBkzhrFjx/LEE0+0agyvvPIKlZWVJCQkeH6WLVtG\nRUUFd911F1deeSUpKSns27fP592YY8eO9STKPXv2UFtby9ChQ3nyyScZPHgwa9asaWm4PKZPn86P\nfvQjDhw4QEJCAs8//zwAW7ZsYdw453e1BoQxJqJ+RowYYSLdli1bQj2EsKcxsuf2GO3bty8g/Zw8\neTIg/bjNrl27zB133GGMMSYxMfGcxGnixImmqKiozf34+tsAdhofOUPP5JRSKgoNGzaMzMxMysrK\naNeuXdBvBKmqqmLChAkMGjQoqPtpSm88UUqpKDVr1iwACgoKgr6v2NhYr4fDzxU9k1NKKeVamuSU\nUkq5liY5pZRSrqVJTimllGtpklNKKeVamuSUUkq5liY5pZRSrqVJTimllGtpklNKKRvr1q1DRCgq\nKvK5feHChSxdutS2n5iYGE/tyqFDh7Js2TJqa2ubbU9OTmbKlClUVlZajiE+Pt7nfhYvXkxSUhIp\nKSmkpqayY8eOZm1OnTrF6NGjqampsR13S82aNYuePXv6nHj1gQce4IMPPiAzM5PBgweTlJTEb37z\nG8/2qqoqRo0aRXV1dUDGohVPlFKRYVHzmaad8J0GgCf+6biP7OxsrrvuOnJycnwWO3aq8VQ6x48f\n5/bbb6esrIxFixY12z5jxgxWrlzJggULWjSG7du3s3HjRnbt2kXHjh0pKSmhqqqqWbvVq1czadIk\nYmJiWv37+HP33Xczd+5cnxVOduzYweOPP85//ud/Mnz4cMrLyxkxYgQ//vGPufLKK4mNjeWGG27g\n1VdfZcaMGW0eS9DO5ERktYgcF5G9Nu2uEpEaEbk1WGNRSqnWqqioYNu2bTz//PPk5OR41i9evJhB\ngwYxZswYDhw44PWeCRMmMGLECJKSkli1apXPfnv27MmqVatYsWKF18SpDdLT0ykuLrYcgy/Hjh2j\nR48edOzYEYAePXpw6aWXNmu3du1axo8f71nOyMjw/B6lpaU+z8KcGjVqFN26Nf9Qsn//fgYOHEjv\n3r09k7526dKFwYMH89VXX3naTZgwgbVr17Z6/40F83LlC0CWVQMRiQH+A3gviONQSqlWW79+PVlZ\nWQwcOJBu3bqxa9cu8vPzycnJoaCggDfeeINPPvnE6z2rV68mPz+fnTt3snz5ckpLS3323a9fP2pr\nazl+/LjX+urqajZt2uSZ083XGPwZO3YsR44cYeDAgTz44IN88MEHzdpUVVVx6NAh+vbt61lXXFzM\n5ZdfDtTNDO5rPrn09HRSU1Ob/WzevNnveBrbtGkTWVneaeHw4cMUFBTwwx/+0LMuOTm5WUxbK2iX\nK40xH4pIX5tmDwOvA1cFaxxKKdUW2dnZzJs3D4Bp06aRnZ1N7969mThxInFxcQDccsstXu9Zvnw5\n69atA+DIkSMcPHiQ7t27++y/8Vlcw3xzUJdQ7r33Xr9jaDgTaio+Pp78/Hzy8vLYsmULU6dOZcmS\nJV4zg5eUlNC1a1fP8pdffknv3r1p167uvGf37t1eM4U3yMvL87lPp9577z3+8Ic/eJYrKiqYPHky\nzz77LOeff75nfUxMDLGxsZSXl7d5doSQfScnIr2BicD1aJJTSoWh0tJS3n//ffbu3YuIUFNTg4gw\nf/58v7N55+bmsnnzZrZv305cXBwZGRmeWbebOnToEDExMfTs2RPw/k7ObgzPPPOM33HHxMSQkZFB\nRkYGQ4YMYc2aNV5JrnPnzl5j2rNnj1dSy8/PZ+rUqc36TU9Pp7y8vNn6pUuX2s4OXllZyYkTJzyX\nTs+ePcvkyZOZMWMGkyZNatb+zJkzdOrUybJPJ0J548mzwL8aY2qspn4HEJHZwGyAXr16kZubG/TB\nBVNFRUXE/w7BpjGy5/YYXXDBBV4HVL83kDjQ/BsvqPBxsG7q5ZdfZvr06V53/910001cccUV/Pzn\nP+ehhx6iurqaDRs2MGvWLMrLy/nHP/5Bly5dqKmpIT8/n48++ojKykrP79Lw35KSEu677z7uv/9+\nKioqPP03TSL+xvCnP/3JZ/uDBw8iIgwYMACou9Hjkksu8WrXvn17qqur+fbbb+nUqRO7d++mvLyc\n8vJyiouL2bBhA4888kizvt955x2/sWratqKigtraWs/6d999l2uvvZby8nKMMTzwwAP079+f+++/\nv9l7S0tL6d69O6dPn/b5AeH06dOO//ZDmeTSgJz6BNcDGCci1caY9U0bGmNWAasA0tLSTEZGxjkc\nZuDl5uYS6b9DsGmM7Lk9Rvv37w/IRJ4G8PUx2knf69at45FHHvFqe9ttt/Hmm28yffp00tPT6dOn\nD6NHj6Zjx4506dKFiRMnsmbNGq699loGDRrEyJEjiYuLo0uXLpw6dYr09HTOnj1L+/btufPOO1mw\nYIHnMqGvcfkbw/r166msrGTw4MGe9QsWLGD06NHMnTuXEydO0L59ewYMGMCqVaua9XvjjTfy6aef\nMmbMGPbu3UuXLl247rrrSElJYfDgwbz++us89thjtjHyZfr06eTm5lJSUsLgwYNZtGgRBQUF3Hrr\nrXTp0oWtW7eSk5PDkCFDSE9PB+Cpp55i3LhxQN1lzZtvvtnv/6NOnToxbNgwZ4PxNV14oH6AvsBe\nB+1eAG510ueIESPaOHF66G3ZsiXUQwh7GiN7bo/Rvn37AtLPyZMnA9KP2+zatcvccccdxhhjEhMT\ngx6nYcOGmaqqKkdtJ06caIqKivxu9/W3Aew0PnJG0M7kRCQbyAB6iMhR4AmgQ31iXRms/SqllLI3\nbNgwMjMzKSsro127dgE5a7ZidUdoY1VVVUyYMIFBgwYFZL/BvLtyegva3h2scSillPJt1qxZABQU\nFIR4JN+LjY31+RB5a2lZL6WUUq6lSU4ppZRraZJTSinlWprklFJKuZYmOaWUUq6lSU4ppZRraZJT\nSinlWprklFJKuZYmOaWUsrFu3TpEhKKiIp/bFy5cyNKlS237iYmJITU1laSkJIYOHcqyZcuora1t\ntj05OZkpU6ZQWVlpOYb4eN9lqxcvXkxSUhIpKSmkpqayY8eOZm1OnTrF6NGjqampsR13S82aNYue\nPXv6nHj1gQceYNu2bZw+fZqrr76aoUOHkpSUxBNPPAHUVTwZNWoU1dXVARlLKAs0K6WUY6kvpga0\nv8KZhY7bZmdnc91115GTk8PChQtbvc/GU+kcP36c22+/nbKyMhYtWtRs+4wZM1i5ciULFixo0Ri2\nb9/Oxo0b2bVrFx07dqSkpISqqqpm7VavXs2kSZOIiYlp9e/jz913383cuXN9Vi7ZsWMHzz33HO3a\nteP9998nPj6es2fPct1113HTTTcxcuRIbrjhBl599VVmzJjR5rHomZxSSlmoqKhg27ZtPP/88+Tk\n5HjWL168mEGDBjFmzBgOHDjg9Z4JEyYwYsQIkpKSWLVqlc9+e/bsyapVq1ixYoXXxKkN0tPTKS4u\nthyDL8eOHaNHjx507NgRgB49enjmcGts7dq1jB8/3rOckZHh+T1KS0t9noU5NWrUKLp169Zs/f79\n+xk4cCAxMTGIiOdM9OzZs5w9e9YzR9+ECRNYu3Ztq/ffmCY5pZSysH79erKyshg4cCDdunVj165d\n5Ofnk5OTQ0FBAW+88QaffPKJ13tWr15Nfn4+O3fuZPny5ZSWlvrsu1+/ftTW1nL8+HGv9dXV1Wza\ntIkhQ4b4HYM/Y8eO5ciRIwwcOJAHH3yQDz74oFmbqqoqDh06RN++fT3riouLufzyy4G6mcEb9t1Y\neno6qampzX42b97sdzyNbdq0iaysLM9yTU0Nqamp9OzZkx//+Mf88Ic/BCA5OblZTFtLL1cqpZSF\n7Oxs5s2bB8C0adPIzs6md+/eTJw4kbi4OABuueUWr/csX76cdevWAXDkyBEOHjxI9+7dffbf+Czu\n1KlTpKamAnUJ5d577/U7huHDh/vsLz4+nvz8fPLy8tiyZQtTp05lyZIlXjODl5SU0LVrV8/yl19+\nSe/evT3z2u3evdtrpvAGeXl5Pvfp1Hvvvccf/vAHz3JMTAyFhYWcOHGCiRMnsnfvXpKTk4mJiSE2\nNpby8vI2z46gSU4ppfwoLS3l/fffZ+/evYgINTU1iAjz58/3XFprKjc3l82bN7N9+3bi4uLIyMjw\nObs1wKFDh4iJiaFnz56A93dydmN45pln/I47JiaGjIwMMjIyGDJkCGvWrPFKcp07d/Ya0549e7yS\nWn5+PlOnTm3Wb3p6erNZvAGWLl3KmDFj/I4HoLKykhMnTvi8dNq1a1cyMjJ49913PZdJz5w5Q6dO\nnSz7dEIvVyqllB+vvfYaM2fO5IsvvuDw4cMcOXKExMREhg8fzrp16zh16hTl5eW89dZbnveUlZVx\n4YUXEhcXR1FRER999JHPvr/99lvmzJnD3Llz/SZMqzFs3brVZ/sDBw5w8OBBz3JhYSF9+vTxanPh\nhRdSU1PjSXR79uzxvD548CAbNmzwebkyLy+PwsLCZj92CQ5gy5YtZGZmev3+J06cAOrOYDdv3swV\nV1wB1CX2iy66iA4dOtj2a0fP5JRSyo/s7GweeeQRr3WTJ08mJyeHqVOnkpqaSp8+fUhPT/dsz8rK\nYuXKlaSkpDBo0CBGjhzp2dZwOfLs2bO0b9+eO++803P3ZEvH8Morr1BZWUlCQoJn/YIFCxg9ejQP\nP/wwJ06coH379gwYMMDnzS9jx45l69atjBkzhj179tClSxeGDh1KSkoKgwcPZs2aNTz22GMtileD\n6dOnk5ubS0lJCQkJCSxatIiCggJuvfVWT5tjx45x1113UVNTQ21tLbfddhs333wzUJcQx40b16p9\nN+NruvBw/hkxYoSj6dPD2ZYtW0I9hLCnMbLn9hjt27cvIP2cPHkyIP24za5du8wdd9xhjDEmMTEx\n6HEaNmyYqaqqctR24sSJpqioyO92X38bwE7jI2fomZxSSkWhYcOGkZmZSVlZGe3atWvzDR52rO4I\nbayqqooJEyYwaNCggOxXk5xSSkWpWbNmAVBQUBDikXwvNjbW50PkraU3niillHItTXJKKaVcS5Oc\nUkop19Ikp5RSyrU0ySmllHItTXJKKaVcS5OcUkop19Ikp5RSyrU0ySmllI1169YhIhQVFfncvnDh\nQpYuXWrbT0xMDKmpqSQlJTF06FCWLVtGbW1ts+3JyclMmTKFyspKyzE0TDra1OLFi0lKSiIlJYXU\n1FR27NjRrM2pU6cYPXo0NTU1tuNuqVmzZtGzZ0+fE68+8MADbNu2zbNcU1PDsGHDPHUrq6qqGDVq\nFNXV1QEZS9AqnojIauBm4LgxptlvKiLjgV8BtUA1MM8Y47ustlIq6u1Pav1M1b4M/myv47bZ2dlc\nd9115OTksHDhwlbvs/FUOsePH+f222+nrKyMRYsWNds+Y8YMVq5c6Sng7HQM27dvZ+PGjezatYuO\nHTtSUlJCVVVVs3arV69m0qRJxMTEtPr38efuu+9m7ty5PiuX7Nixg+eee86z/Jvf/IbBgwdz8uRJ\noK7iyQ033MCrr77KjBkz2jyWYJ7JvQBkWWz/CzDUGJMKzAJ+H8SxKKVUq1RUVLBt2zaef/55cnJy\nPOsXL17MoEGDGDNmDAcOHPB6z4QJExgxYgRJSUk+ZwAA6NmzJ6tWrWLFihVeE6c2SE9Pp7i42HIM\nvhw7dowePXrQsWNHAHr06OFzDre1a9cyfvx4z3JGRobn9ygtLfV5FubUqFGj6NatW7P1+/fvZ+DA\ngZ7EevToUd5++23uu+8+r3YTJkxg7dq1rd5/Y0FLcsaYD4F/WmyvMN//nz0PaP5/WSmlQmz9+vVk\nZWUxcOBAunXrxq5du8jPzycnJ4eCggLeeOMNPvnkE6/3rF69mvz8fHbu3Mny5cspLS312Xe/fv2o\nra3l+PHjXuurq6vZtGmTZ043X2PwZ+zYsRw5coSBAwfy4IMP8sEHHzRrU1VVxaFDh+jbt69nXXFx\nMZdffjlQNzO4r/nk0tPTSU1NbfazefNmv+NpbNOmTWRlfX/uM2/ePJ555hnPjOQNkpOTm8W0tUJa\noFlEJgJPAz2Bf7FoNxuYDdCrVy9yc3PPyfiCpaKiIuC/w9mvKprvp6qSL098zWVdLyU+Ns6zvkNv\n39fxw0kwYuQ2bo/RBRdc4HMW6kBx2vdLL73Egw8+SHl5ORMmTGDNmjVccskljBs3zjNLd1ZWFmfO\nnPH0+etf/5qNGzcCcOTIEQoLC7n66qt97tcYQ0VFBXFxcZw6dcozQ/ePfvQjbrvtNsrLy32OoSEh\n+fo9cnNz+etf/8qHH37IbbfdxqJFi7wu/R07dozzzz/f896///3vXHzxxXz33XcAfPzxxwwaNKhZ\n3++8847jeFZUVFBbW+u1/u233+a3v/0t5eXlbNq0ia5duzJw4EDy8vKorq72atuhQwe+/vprn7Mj\nnD592vHffkiTnDFmHbBOREZR9/2cz+lljTGrgFUAaWlpJiMj45yNMRhyc3MJ9O9w9NE8r+XtXxQw\nZ93jrJz4JFf1ucRrW8KMdMJdMGLkNm6P0f79+4M6/YuTvktLS/nwww8pKipCRDxJbf78+XTq1MnT\nR2xsLB07dqRLly7k5uaSl5fHjh07iIuLIyMjg5iYGE/bxvs9dOgQMTEx9OvXDxGhc+fO7N6929EY\nnn32WcvfY9y4cYwbN460tDTWrFnDnDlzPNuqq6upqqryvHffvn0MGzbMs/zZZ58xderUZn2np6f7\nTKpLly5tNjt4fHy81xQ+lZWVVFRUMHDgQKBu5oN3332XzZs3c/r0aU6ePMlPfvITXn75ZaDubNPf\n7OCdOnVi2LBhPn/vpsLi7sr6S5v9RaRHqMfiBo0T3I/6OPtDUEo199prrzFz5ky++OILDh8+zJEj\nR0hMTGT48OGsW7eOU6dOUV5ezltvveV5T1lZGRdeeCFxcXEUFRXx0Ucf+ez722+/Zc6cOcydOxcR\nafEYtm71fZ/egQMHOHjwoGe5sLCQPn36eLW58MILqamp4fTp0wDs2bPH8/rgwYNs2LDB5+XKvLw8\nCgsLm/00TXC+bNmyhczMTM/y008/zdGjRzl8+DA5OTlcf/31ngRXWlrqN8G1VMjO5ERkAPC5McaI\nyHAgFvB94Vo5pglOqcDJzs7mkUce8Vo3efJkcnJymDp1KqmpqfTp04f09O+vjmRlZbFy5UpSUlIY\nNGgQI0eO9Gw7deoUqampnD17lvbt23PnnXd67p5s6RheeeUVKisrSUhI8KxfsGABo0eP5uGHH+bE\niRO0b9+eAQMG+Lz5ZezYsWzdupUxY8awZ88eunTpwtChQ0lJSWHw4MGsWbOGxx57rEXxajB9+nRy\nc3MpKSkhISGBRYsWUVBQwK233uro/Vu2bGHcuHGt2ndT4uuunoB0LJINZAA9gG+AJ4AOAMaYlSLy\nr8BM4CxwCvi5k0cI0tLSzM6dO4My5nMlWJcrnSa4hKf0cqUbuD1G+/fvZ/DgwW3up7y8POizXkei\ngoICli1bxksvvUS/fv349NNPgxqn4cOHs2PHDkdnZ5MmTeLpp5/2Ozu4r78NEck3xqQ1bRu0Mzlj\nzHSb7f8B/Eew9h9t9AxOKdUSw4YNIzMzk7KyMq/vzoLF6o7QxqqqqpgwYYLfBNdSIb3xRAWOJjil\nVEvNmjULqDurCxexsbE+HyJvrbC48US1ndMEt/2L8PljVkqpYNMk5xJOE9ycdY+fg9EopVR40CQX\nJRp/Z6eUUtFCk1wU0JtSlFLRSpOcy2mCU0pFM01yLqYJTikV7TTJuZQmOKWU0ufkXEkTnHKjZdNv\nofibEl78az4zrxnBgF72pW6t2i/IftP2/TExMQwZMsRThuuuu+5i3rx5tGvXjtzcXMaPH0+/fv04\nffo006ZN44knngDqnjsbPnw47777LjfeeKOnv/j4eCoqvGcMOXDgAA888AAnTpzgzJkzpKen+yzD\ndezYMe6//342btxIYWEhX3/9tW3pq507d/Liiy+yfPlyXnjhBXbu3MmKFStYsWIF5513Hvfcc49t\nDCKdnsm5jCY45WYDevVg5jUjePGv+RR/UxLw9k01zNT92Wef8ec//5l33nnHM4s31FXlLygoYOfO\nnbz88svk5+cD38/inZ2dbbuPn/70p8yfP5/CwkL279/Pww8/7LPdsmXLuP/++4G6ostW0940SEtL\nY/ny5c3Wz5o1y+d6N9Ik5yKa4FQ0ONeJroHVTN7nnXceI0aM4PPPP8cYw2uvvcYLL7zAn/70J091\nf3+OHTvmVWTZV/V/gNdff52srCyqqqp4/PHHefXVV0lNTeXVV1/l448/5pprrmHYsGFcc801nhm+\nc3Nzufnmm5v1FRcXR9++ffn4449bGoaIo0nOJTTBqWgSqkTnbybv0tJSPvroI5KSkti2bRuJiYn0\n79+fjIwM2zOu+fPnc/3113PTTTfxX//1X5w4caJZm7///e9ceOGFdOzYkdjYWJ588kmmTp1KYWEh\nU6dO5YorruDDDz+koKCAJ598kkcffdT2d0lLSyMvL8+2XaTTJOcSmuBUtAlVomt8FpeXl8ewYcMY\nO3YsjzzyCElJSWRnZzNt2jQApk2bZnvJ8p577mH//v1MmTKF3NxcRo4cyZkzZ7zaHDt2jIsuushv\nH2VlZUyZMoXk5GTmz5/PZ599Zvt79OzZk6+//tq2XaTTJOcSWrtSRaO2JLrWaJjJu2fPnsD338nl\n5+czZ84campqeP3113nyySfp27cvDz/8MJs2bfI5m3Zjl156KbNmzWLDhg20b9+evXv3em3v3Lmz\n5WXPxx57jMzMTPbu3ctbb71le4kU4PTp03Tu3NnBbx3ZNMm5hNauVNGqtYmupZzM5L1582aGDh3K\nkSNHOHz4MF988QWTJ09m/fr1fvt99913OXv2LAD/+Mc/KC0tpXfv3l5tBg4cyOHDhz3LXbp08Uqc\nZWVlnve88MILjn6fv/3tbyQnJztqG8n0EYIoobUrVaSzu+X/OT/r2zJpaktn8s7OzmbixIle6yZP\nnsxvf/tb7rzzTp8zeR89epSf/exndOrUCYBf//rXXHzxxV59nHfeefTv35/i4mIGDBhAZmYmS5Ys\nITU1lX/7t3/jF7/4BXfddRfLli3j+uuvd/S7bdu2zfPIg5sFbWbwYNGZwX07+qj/L5Cb3pSiM4O7\ng9tjpDODe1u3bh35+fn8+7//e5v7ajwrOERejMJiZnAVHvSuS6XcYeLEiZSWlgakr5KSEn71q18F\npK9wp0nOxTTBKeUu9913X0D6+fGPfxyQfiKB3njiUprglFJKz+TC3rLpt3gt+6vFd1vizz2vNcEp\npVQdPZOLMHa3S2uCU0qp72mSi0D+Ep0mOKWU8qaXKyNU40Q385oRbG+nCU65W0sek/FioEyat5+y\n9qe2+wzXqXZaY+XKlcTFxTFz5kyKioqYNm0aIsJrr73mqeASCBs3buSTTz7xmq0hlPRMLoI1TnSa\n4FS0aukVjJZU/gnXqXZaY86cOcycOROA9evXM378eAoKCujfv7/te40x1NbWOtrPv/zLv/Dmm29S\nWVnZ6rEGkia5CNeQ6LR2pb2jj+bZ/vzPjOV0j+sa6qEqh1qb4FpT+SdcptqButJdc+fO9Wy7+eab\nyc3NBerOFn/5y18ydOhQRo4cyTfffAPAwoULWbp0Ke+88w7PPvssv//978nMzARgxYoVJCcnk5yc\nzLPPPgvA4cOHGTx4MA8++CDDhw8nLy+PK664gvvuu4/k5GRmzJjB5s2bufbaa7n88ss90/aICBkZ\nGa0+4ww0TXJhzmktPq1d2XZa+iyytCXBtfaKRzhMtWPnu+++Y+TIkXz66aeMGjWK3/3ud17bx40b\nx5w5c5g/fz5btmwhPz+fl19+mR07dvDRRx/xu9/9joKCug/DBw4cYObMmRQUFNCnTx+Ki4v52c9+\nxu7duykqKuKVV15h69atLF26lKeeesqzj3Caxido38mJyGrgZuC4MaZZFVARmQH8a/1iBfATY8yn\nwRpPU/0ftZ9VF+Dzp6ynl2+N05/tY/9Dc+0bAi9+frDZ4wKtoQdwa3rTTmQJRYJr4GuqnXbt2nmm\n2nnooYe8ptp56aWXmDRpkt/+7rnnHm688UbeffddNmzYwH//93/z6aefeiU0u6l2GouNjfVMlDpi\nxAj+/Oc/W7bfunUrN998M+eddx4AkyZNIi8vj1tuuYU+ffowcuRIT9vExETPmWZSUhI33HADIsKQ\nIUO8CkiH0zQ+wTyTewHIstj+d2C0MSYF+BXQ/JtWFZD5r/QAbk3jE1lCmeDCZaqd9u3be31H1nhb\nhw4dPLMkxMTEUF1dbblvq/rFDYmvQePE265dO89yu3btvPYTTtP4BC3JGWM+BP5psf2vxpj/rV/8\nCEjw1zaatXWiRz2AW9P4RJZWJbj1gfn/G05T7fTt25fCwkJqa2s5cuSI5/uw1hg1ahRvv/02lZWV\nfPfdd6xbt4709LYVcQ+naXzC5RGCe4FNoR5EuGr6uIDTS5d6ALem8YksCU+lM4V0pmB/63+DKaST\nVX6P66baufbaaz2XDpOTkxk+fHirfj+A4cOHM2PGDK6++mqgrj7msGHDvJJqS23ZsoWnn3661e8P\npKBOtSMifYGNvr6Ta9Qmk7qpoK4zxvgssS0is4HZAL169RqRk5PT5rHt/eqko3bJvc933Oe+0n2O\n2iXUXkTs8W8dtS2Li/W8PnO2mtKKSrrHx9Gxg/fnk26x3v8oKqoq+fLE11zW9VLiY+O8tnXoHe9o\n36FUUVFBfHxgx3n2q++fT7KKD0RvjMLJBRdcwIABA9rcT01NDTExMQEYUWi99dZbFBQU8Pjjgb95\nLJAxOn78OPfeey9vvfVWQPrzpbi4mLKyMq91mZmZ4TfVjoikAL8HbvKX4ACMMauo/84uLS3NBGIO\nrXud3ngyw/m+5r04z1G7JeWz6fOcvykevW1K6ee1XPxNCY/5OKO71k/tyqv6XNKsz4QZ0TmfXMPD\nxHbxgeiNUTjZv39/QOY4i7S50vy5/fbbqaysDMrvEsgYFRUV8eyzzwY15p06dWLYMGdXX0L2CIGI\nXAa8AdxpjPlbqMYRabR2ZdtofFQkC9RUO8F01VVXkZqaGupheAQtyYlINrAdGCQiR0XkXhGZIyJz\n6ps8DnQHnhORQhGJ7Om+zyGtXdk6Gp/IE8yvU1RkaunfRNAuVxpjpttsvw8I/48lYUprV7acxiey\ndOrUidLSUrp37+73bkYVXYwxlJaWem7ScSJc7q5UrdA40b3abp8ewG205LbzKYT/d3Jul5CQwNGj\nR/n2W2c3aflz+vTpFh0Uo1EkxahTp05ed6ja0SQX4RoSXeYl0/QAbqMlDw635DZ1FRwdOnQgMTGx\nzf3k5uY6vkkhWrk5Rprk7Czq5rxt4mUB333xNyW2z8W1tHalHsB909JnSrmPFmgOc20t6dVAD+DW\n9KYUpdxJk1yY09qVwafxUcq9NMmFOa1dGVwaH6XcTZNcBGhtotMDuDWNj1Lup0kuQrQ00ekB3JrG\nR6nooEkugjhNdHoAt6bxUSp6aJKLMFq7sm00PkpFF8skJyLXN3qd2GSb//ncVVBp7crW0fgoFX3s\nzuSWNnr9epNt/1+Ax6JaoGmi0wO4PY2PUtHHruKJ+Hnta1mdY1q7smW0dqVS0cfuTM74ee1rWYVA\nQ6JryQE8WrWk9JlSyh3sklw/EXlTRN5q9Lphue2VU5UtJ48LtLR2pfJNS58p5T52lyvHN3q9tMm2\npssqCBrmi7Mr0mxHD+DW9DtNpdzJMskZYz5ovCwiHYBk4CtjzPFgDkzVaTwxamsTnR7ArWl8lHIv\nu0cIVopIUv3rC4BPgReBAhGxnPlbBYbWrgwujY9S7mb3nVy6Meaz+tf3AH8zxgwBRgC/COrIlIfW\nrgwOjY9S7meX5Koavf4xsB7AGPOPYA1I+aa1KwNL46NUdLBLcidE5GYRGQZcC7wLICLtgc7BHpzy\nprUrA0Pjo1T0sEtyDwBzgT8A8xqdwd0AvB3MgSnftHZl22h8lIoulknOGPM3Y0yWMSbVGPNCo/Xv\nGWP+T9BHp3zS2pWto/FRKvpYPkIgIsutthtjfhrY4SinGie6mdeMYHs7PYDb0fgoFX3sHgafA+wF\n/gh8jdarDCtau7JltHalUtHH7ju5S4BVwI3AnUAH4E1jzBpjzJpgD07Z09qVzmnpM6Wij913cqXG\nmJXGmEzgbqAr8JmI3HkOxqbQ2pXnkpY+U8p97C5XAiAiw4Hp1D0rtwnId/Ce1cDNwHFjTLKP7VdQ\nd9fmcOCXxhithemD1q609+D11ziKz22JP/e7TW9KUcqd7Mp6LRKRfGAB8AGQZoy51xizz0HfLwBZ\nFtv/CfwULfRsqS0lvRq4/QCu8VFK+WP3ndxjwAXAUOBpYJeI7BaRPSKy2+qNxpgPqUtk/rYfN8Z8\nApxt4ZijitautKfxUUr5Y3e5UueMCwNNHxdweukyWg7gGh+llD9iTMsn+BaRGGCaMWatTbu+wEZf\n38k1arMQqLD6Tk5EZgOzAXr16jUiJyenxWNuau9XJx21S253yHGf+2JjHbVLqL2I2OPfOmpbFvd9\nn2fOVlNaUUn3+Dg6dvD+fNIt9mKv5YqqSr488TWXdb2U+Ng4r20desc72ncoVVRUEB/vbJzf/L0Y\nsI4PeMfIKj7gvhhFM42TPTfEKDMzM98Yk9Z0vd3D4OcDDwG9gTeBP1NX5uv/AoWAZZILFGPMKuoe\nZSAtLc1kZGS0uc97H33HUbvPOzq/UWNe4mWO2i0pn02f555z1HZTSj+v5eJvSnjMxxnLtY1uqmh8\nhnJVn0ua9ZkwI/yfAcvNzcXp/+dl/73M89pffOD7GNnFB9wXo2imcbLn5hjZXa58CfhfYDtwH/Bz\nIBYYb4wpDO7QlC92l+ai/RKcxqdt/mfGcsfxSXgq/D8IKGWX5PrVzx+HiPweKAEuM8aU23UsItlA\nBtBDRI4CT1D3MDnGmJUicjGwEzgfqBWRecCVxhhn1xGjmL8DuR7A62h8Wk/jo9zGLsl57nw0xtSI\nyN+dJLj69pYzh9fPaJDgpC/V3LmoXdnf4SVdgM+fGheQfQaKr0SnB3B7WvpMuY3dIwRDReRk/U85\nkNLwWkT0jCvEGh/I9QDeXNPHL7T0mT2tnKPcxq6sV4wx5vz6ny7GmPaNXp9/rgap/NPaldYaJzo9\ngLedmyvnKHeyO5NTIaa1K9uuIdHZ0QO4Nf1OU0UiTXJhrq0lqxq4+QDu9IOAFT2AW9P4qEjlqECz\nCp3WVPJoKhIPUKc/28f+h+Y6avvi5wejLj7nksZHRTI9kwtzWrvSnsYneDQ+KtJpkosArU100XKA\n0vgEh8ZHuYEmuQjR0gN5tB2gND6BpfFRbqFJLoI4PZBH6wFK4xMYGh/lJprkIozdgTzaD1Aan7bR\n+Ci30SQXgfwdyPUAVUfj03oaH+U2+ghBhDoXtSuDIfXFVEftltRNH9hqWruydbR2pXIbPZOLYFq7\n0prWrmw5rZyj3EaTXITT2pXWtHZlYLm5co5yJ01yYU5rV7ad1q4MDP1OU0UiTXJhTmtX2tPalcGn\n8VGRSpNcmGtLyaoGbj9AaXyCS+OjIpneXRnmfN0l2BLn7AC1qJuzdomXBXzXERGfCKXxUZFOz+Qi\ngNZmtKbxCQ6Nj3IDTXIRQmszWtP4BJbGR7mFJrkIorUZrWl8AkPjo9xEk1yE0dqM1jQ+baPxUW6j\nSS4CaW1Gaxqf1tP4KLfRJBehmh7I9QDuzVei0/jY08o5ym00yUUwrV1pTWtXtpxWzlFuo0kuwmnt\nSmtauzKw3Fw5R7mTJrkwp7Ur205rVwaGXhJXkShoSU5EVovIcRHZ62e7iMhyESkWkd0iMjxYY4lk\nWrvSntauDD6Nj4pUwTyTewHIsth+E3B5/c9s4LdBHEvE0tqV9jQ+waXxUZEsaEnOGPMh8E+LJuOB\nF02dj4CuInJJsMYTqVpbsqpBNBygND7Bo/FRkS6U38n1Bo40Wj5av041obUZrWl8gkPjo9xAjDHB\n61ykL7DRGJPsY9vbwNPGmK31y38BfmGMyffRdjZ1lzTp1avXiJycnDaPbe9XJx21S253yHGf+2Jj\nHbVLqL2I2OPfOmpbFvd9n2fOVlNaUUn3+Dg6dvCeQKJb7MVeyxVVlXx54msu63op8bFxXts69I53\ntG+nMQLncQpmjKziA94xsooPOI9RKFVUVBAfH9hxnv2qoq5vm/hAZMQIghMnt3FDjDIzM/ONMWlN\n14dyqp2jwA8aLScAX/tqaIxZBawCSEtLMxkZGW3e+b2PvuOo3ecdnd+oMc/hNDJLymfT57nnHLXd\nlNLPa7n4mxIe8zGtzLWJP/e8bvwJ/Ko+za8AJ8xId7RvpzEC53EKdoz8xQe+j5FdfMB5jPq3JEZP\njXPc1onc3FwC8W+hsaOP5jmKDziPUagFI05u4+YYhfJy5ZvAzPq7LEcCZcaYYyEcT0TQ2ozWND5t\no/FRbhPMRwiyge3AIBE5KiL3isgcEZlT3+Qd4BBQDPwOeDBYY3Ebrc1oTePTehof5TZBu1xpjJlu\ns90ADwVr/27XdMbw7e30AN6YrxnVNT72WlI5ZwqRcblSRTeteBLBtHalNa1d2XJaOUe5jSa5CKe1\nK61p7crAcnPlHOVOoby7UjlQ/E2JbUmqltaunMJPAzW8iKC1K2HZ9Fsstxd/U8KLf82naMFmv230\nO00VifRMLsxp7Up7Wruy7ew+CER7fFTk0iQX5rR2pT2Nj722fBCIhvgo99IkF+a0dqU9jY89jY+K\nVprkIoDWZrSm8bGn8VHRSpNchGjpgTzaDlAaH2saHxWtNMlFEKcHqmg9QGl8rGl8VDTSJBdhtDaj\nNY2PNY2Pijaa5CKQ1ma0pvGxZpXoND7KbfRh8AiltSutRUPtytOf7WP/Q3OdNW4yZZOv+IDWrlTu\no2dyEUxrV1rT2pXWfJ3Raekz5TZ6JhfhGg5UmZdM00/gPjQ+kD+64D9s20db6bOmZ3QkWrd3c+Uc\np44+mud3W9NL4glPRc+/tXClZ3JhzmmlCv0E7p/WrrTWONFZ0e80rWl8wpOeyYW5pt+ZtJabD+BO\ni1hbCacDVOqLqY7aLWF2wPaptSvbRuMTvvRMLsxp7Up7Gh97WrsyeDQ+4U2TXJjT2pX2ND72ND7B\nofEJf5rkIoDWZrSm8bGn8Qk8jU9k0O/kIoS/55r8ibZ/gBERn0XdnLVLvCzgu46I+EQQjU/k0DO5\nCKK1B61pfKxpfAJD4xNZNMlFGK09aE3jY03j03Yan8iilysjkL9LT3qAqqPxsWZ16TIY8en/6DuO\n237+1LiA7TdYtPRZZNEkF6G0dqW1aKhd2RZau7L1WlJ4wWnlHLd9EAgnerkygmntSmtau9Ka1q4M\nDjcXXohEmuQiXMOBSg/gvjU+kOsBvLm2zBiumtNL4uFHk1yY09qVbae1K61p7crA0PiEJ01yYa6t\nJasauPkA3paSVQ2i/QCltSvbRuMTvoKa5EQkS0QOiEixiDziY/uFIrJORHaLyMcikhzM8UQirV1p\nT+NjT2tXBo/GJ7wFLcmJSAzw/4CbgCuB6SJyZZNmjwKFxpgUYCbwm2CNJ1Jp7Up7Gh97Gp/g0PiE\nv2CeyV0NFBtjDhljqoAcYHyTNlcCfwEwxhQBfUWkVxDHFJG0NqM1jY89jU/gaXwigxhjgtOxyK1A\nljHmvvrlO4EfGmPmNmrzFNDJGLNARK4G/lrfJr9JX7OhbvKsXr16jcjJyWnz+PZ+ddJRu+R2hxz3\nuS821lG7hNqLiD3+raO2ZXHf93nmbDWlFZV0j4+jYwfvRxy7xV7stVxRVcmXJ77msq6XEh8b57Wt\nQ+94R/t2GiNwHqdgxsgqPuAdI6v4gDtjZBcf+D5GdvGBIMWo9/mO2zpVUVFBfLyzsTpx9qsKR/GB\n6I1RKGRmZuYbY9Karg/mw+DiY13TjLoE+I2IFAJ7gAKgutmbjFkFrAJIS0szGRkZbR7cvQ4fvvy8\no/MbNeY5LKy7pHw2fZ57zlHbTSn9vJaLvynhMR+VKq5N/LnndeNPmFf1uaRZnwkznD3E6zRG4DxO\nwY6Rv/jA9zGyiw+4N0ZW8YG6GDmJDwQpRjMyHLd1Kjc3l0AcMxr8z4zljuID0RujcBLMy5VHgR80\nWk4Avm7cwBhz0hhzjzEmlbrv5C4C/h7EMUU8rT1oTeNjTePTdhqfyBLMM7lPgMtFJBH4CpgG3N64\ngYh0BSrrv7O7D/jQGOP8vD1KaW1Gaxofa+e6dmWkWDb9Fs/r4m9K/E5LpKXPIkvQzuSMMdXAXOA9\nYD/wR2PMZyIyR0Tm1DcbDHwmIkXU3YX5s2CNx22afiLXA7g3X2csGp/v+Tuj08o5dazOeLXwQmQJ\n6nNyxph3jDEDjTH9jTGL69etNMasrH+93RhzuTHmCmPMJGPM/wZzPG6jtSutae1Ka1q70log7tpV\noacVTyKc1q60prUrrWntSmttiY9+4AwPmuTCnNaubDutXWlNa1da0xnVI5smuTCntSvtae3KttPa\nldbsPghEe3zCmSa5MKe1K+1pfOxp7cq28/dBQOMT3jTJhTmtXWlP42NP42OvNR8Eoik+kSqYz8mp\nALF6rslKtPwD1PjYi+b4nP5sH/sfmmvb7sXPD0ZlfNxOk1yEaOmBPNr+AWp8rEVMfBZ1c9Qs1WHp\nM4AldWVvbUVEfFSL6eXKCKJ3eVnT+FjT+FjT+LiTJrkIo7UHrWl8rGl8rDlJdNEcn0ikSS4C+fuH\nGO0HqAYaH2tWB3KNj32i08ILkUWTXITS2pXWtHalNa1daU1rV7qHJrkIprUrrWntSmtau9Ka1q50\nB01yEU5rV1rT2pXWtHalNa1dGfk0yYU5rV3Zdlq70prWrrSmd11GNk1yYU5rV9rT2pVtp7UrrWnt\nysilSS7Mae1Kexofe1q7su20dmVk0iQX5rR2pT2Njz2Njz2tXelOmuQiQCDu8nLzP0CNjz2Njz2N\njztpkosQepeXNY2PNY2PPY2PO2mSiyB6l5c1jY81jY81jY87aZKLMFp70JrGx5rGx5rWrnQfTXIR\nSGszWtP4WNPalda0dqW7aJKLUFq70prWrrSmtSutae1K99AkF8G0dqU1rV1pTWtXWtPale6gSS7C\nae1Ka1q70prWrrSmd6VGvvahHoCyVvxNiW1JqpbWrpzCTwM1vIigtSutNT6QPzrSf7toPYA3js/M\na0ZAou920RCfZdNv8bm++JsST3wajle3Jf7cq42/+CQ8lR68AaNJLuw1/cNpLTcfwJ1+ELASDQco\nK1q70prdB4FzGp9F3Zy1e+KfwR1HI00/CIRTZZigJjkRyQJ+A8QAvzfGLGmy/QLgZeCy+rEsNcb8\nIZhjijRWfzhOuf0ApfGx15YPAtEQHycirXZl6oupjtsuKZ/N/ofm2jdM6ed3k78z3lDHJ2jfyYlI\nDPD/gJuAK4HpInJlk2YPAfuMMUOBDOA/RSQ2WGOKRFq70p7Gx57Gx57Wrmy7prM1hEN8gnnjydVA\nsTHmkDGmCsgBxjdpY4AuIiJAPPBPoDqIY4pIWpvRmsbHnsbHnsbHntMPAjOvGRE28QlmkusNHGm0\nfLR+XWMrgMHA18Ae4GfGmNogjili6V1e1jQ+1jQ+9jQ+9pzGZ0CvHmETHzHGBKdjkSnAjcaY++qX\n7wSuNsY83KjNrcC1wAKgP/BnYKgx5mSTvmYDswF69eo1Iicnp83j2/vVSftGQHK7Q4773Bfr7Epr\nQu1FxB7/1lHbsjjvPs+craa0opLu8XF07PD9V6rdYi/2vK6oquTLE19zWddLiY+Na9Znh97xjvbt\nNEbgPE7BjpG/+MD3MbKLD7g3RlbxgboYOYkPREaMwHmcyuJibeMDEMv5juID7ovR8Q7tbOPTIJbz\nbeMDzmNkJzMzM98Yk9Z0fTCT3I+AhcaYG+uX/w3AGPN0ozZvA0uMMXn1y+8DjxhjPvbXb1pamtm5\nc2ebx9f/0Xcctfu84x2O+0xNvMxRuyXls+nz3HOO2m7y8UWv1e26Tj5hOr1l12mMwHmczkWMfMUH\n6mLk9BO4m2PkLz4AP2g3xvEn8EiIETiPU0OMrOIDsHjDh47PUNwYI7v4NGj6CIEv278oYMrawDzS\nJCI+k1wwL1d+AlwuIon1N5NMA95s0uZL4Ib6AfYCBgHOT52ilNZmtKbxsaa1K61p7Uprbb0ZrsG5\nKrwQtCRnjKkG5gLvAfuBPxpjPhOROSIyp77Zr4BrRGQP8BfgX40xrY9aFNHalda0dqU1rV1pTWtX\nWgvkXd/BFtSyXsaYd4wxA40x/Y0xi+vXrTTGrKx//bUxZqwxZogxJtkY83Iwx+M2WrvSmtautKa1\nK61p7UprkXJXs9aujHBau9Ka1q60prUrreldqdYiIT6a5MKc09t19QDun9autNb0AV5/ou0A3kBn\nDLcW7vHRJBfm2vrlbgM3H8BbU6miqWg9QDXQ2pXW7D4IaHzCd8Z5TXJhLpB3Mbn1H6DGx15bPghE\nQ3yciLTaledauN7VrEkuzGntSnsaH3saH3tau7Ltoq12pQqQSLmLKVQ0PvY0PvY0Pva0dqUKmki4\niymUND7WND72ND72IrF2pSa5CBLudzGFmsbHmsbHmsbHXks+CIRLfDTJRZhwvospHGh8rGl8rDlJ\ndBofZ4kuXJ7b1SQXgcL1LqZwofGxprUrrWntSmtau1KdE1q70prWrrSmtSutae1Ka1q7Up0TWrvS\nmtautKa1K61p7UprkXJXsya5CKe1K61p7UprWrvSmt6Vai0S4hO0SVODRUS+Bb4I9TjaqAegUwpZ\n0xjZ0xg5o3Gy54YY9THGXNR0ZcQlOTcQkZ2+ZrBV39MY2dMYOaNxsufmGOnlSqWUUq6lSU4ppZRr\naZILjVWhHkAE0BjZ0xg5o3Gy59oY6XdySimlXEvP5JRSSrmWJrlzTESyROSAiBSLyCOhHk+4EZHV\nInJcRPaGeizhSkR+ICJbRGS/iHwmIj8L9ZjCjYh0EpGPReTT+hgtCvWYwpWIxIhIgYhsDPVYgkGT\n3DkkIjHA/wNuAq4EpovIlaEdVdh5AcgK9SDCXDXwf4wxg4GRwEP6d9TMGeB6Y8xQIBXIEpGRoR1S\n2PoZsD/UgwgWTXLn1tVAsTHmkDGmCsgBxod4TGHFGPMh8M9QjyOcGWOOGWN21b8up+4A1Tu0owov\npk5F/WKH+h+9AaEJEUkA/gX4fajHEiya5M6t3sCRRstH0YOTagMR6QsMA3aEeChhp/4yXCFwHPiz\nMUZj1NyzwC+A2hCPI2g0yZ1b4mOdfrpUrSIi8cDrwDxjzMlQjyfcGGNqjDGpQAJwtYgkh3hIYUVE\nbgaOG2PyQz2WYNIkd24dBX7QaDkB+DpEY1ERTEQ6UJfg1hpj3gj1eMKZMeYEkIt+19vUtcAtInKY\nuq9OrheRl0M7pMDTJHdufQJcLiKJIhILTAPeDPGYVIQREQGeB/YbY5aFejzhSEQuEpGu9a87A2OA\nopAOKswYY/7NGJNgjOlL3bHofWPMHSEeVsBpkjuHjDHVwFzgPepuFvijMeaz0I4qvIhINrAdGCQi\nR0Xk3lCPKQxdC9xJ3SfvwvqfcaEeVJi5BNgiIrup+3D5Z2OMK2+RV9a04olSSinX0jM5pZRSrqVJ\nTimllGtpklNKKeVamuSUUkq5liY5pZRSrqVJTqkmRKSm/rb8vSLyPyISF+D+c0UkrYXveVJExtS/\nntfSMYlIhX0rR/0cFpEeDtum6qMNKtQ0ySnV3CljTKoxJhmoAuaEcjAiEmOMedwYs7l+1TwgoIk3\nSFIBTXIqpDTJKWUtDxggIt1EZL2I7BaRj0QkBUBEForISyLyvogcFJH769dnNJ6fS0RWiMjdTTsX\nkd+KyM6mc57VnzE9LiJbgSki8oKI3CoiPwUupe5B5y0icq+I/Fej990vIj6roIjIf4rILhH5i4hc\nVL/Oc1YpIj3qSzw1FDdeKiJ76n/nh5v01VlE3q3f33n18wB+Uj8v2fj6ij5PAlPrz4qntib4SrWV\nJjml/BCR9tTN/bcHWAQUGGNSgEeBFxs1TaFuupIfAY+LyKUt2M0vjTFp9X2Mbkie9U4bY64zxuQ0\nrDDGLKeu3mmmMSaTupqDt9TXsgS4B/iDj/2cB+wyxgwHPgCesBnXbCARGFb/O69ttC0eeAt4xRjz\nO+CX1JWEugrIBH5N3dQ2jwOv1p8Vv2obCaWCQJOcUs11rp+iZSfwJXV1Iq8DXgIwxrwPdBeRC+rb\nbzDGnDLGlABbqJs30KnbRGQXUAAkUTeZbgPbxGCM+Q54H7hZRK4AOhhj9vhoWtuov5frfx8rY4CV\n9aXoMMY0nuNvA/AHY0xDoh8LPFIfs1ygE3CZ3diVOhfah3oASoWhU/VTtHjUF0VuyjT5b+P11Xh/\niOzU9M0ikgj8X+AqY8z/isgLTdp953C8v6fu7LII32dxvjSMufE4G+9b8D8N1DbgJhF5xdTVBRRg\nsjHmQONGIvJDh2NRKmj0TE4pZz4EZkDd921ASaM53MaLSCcR6Q5kUFcQ+AvgShHpWH/Gd4OPPs+n\nLpGViUgv6i6NOlEOdGlYqJ8M9AfA7UC2n/e0A26tf307sLX+9WFgRP3rWxu1/xMwp/6SLSLSrdG2\nx4FS4Ln65feAhxs+CIjIMF/jVCoUNMkp5cxCIK2+qv0S4K5G2z4G3gY+An5ljPnaGHME+COwm7rv\nswqadmiM+bR+/WfAaurOkJxYBWwSkS2N1v0R2GaM+V8/7/kOSBKRfOB66m4KAVgK/ERE/go0fjTg\n99Rdqt0tIp9Slxgbmwd0EpFngF9R9x3cbhHZW78MdZdur9QbT1Qo6SwESrWBiCwEKowxS0M8jo3A\nfxlj/hLKcSgVbvRMTqkIJiJdReRv1H2PqAlOqSb0TE4ppZRr6ZmcUkop19Ikp5RSyrU0ySmllHIt\nTXJKKaVcS5OcUkop19Ikp5RSyrX+f5q35QxBTI35AAAAAElFTkSuQmCC\n",
            "text/plain": [
              "\u003cFigure size 700x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        }
      ],
      "source": [
        "bar_plot_rmse([\n",
        "    (\"AdaDPALS ($\\mu=1$)\",   model10m_eps20_ada1, 0),\n",
        "    (\"AdaDPALS ($\\mu=1/2$)\", model10m_eps20_ada2, 1),\n",
        "    (\"AdaDPALS ($\\mu=1/3$)\", model10m_eps20_ada3, 2),\n",
        "    (\"AdaDPALS ($\\mu=1/4$)\", model10m_eps20_ada4, 3),\n",
        "    (\"DPALS (tail)\",         model10m_eps20_tail, 5),\n",
        "    (\"DPALS (uniform)\",      model10m_eps20_unif, 6),\n",
        "], item_frac = 1.0, num_buckets = 5, ylim=[0.75, 1.5])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mUfZAH2WL2Uf"
      },
      "source": [
        "# Example training with AM-DPSGD\n",
        "\n",
        "Alternating minimization where:\n",
        "- The user update is a Least Squares (exact) update.\n",
        "- The item update is (DP)SGD. This is much faster on GPU."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "VYEcdmtBTHXu"
      },
      "outputs": [],
      "source": [
        "# Use a simple embedding layer as encoder.\n",
        "\n",
        "class Encoder(tf.keras.Model):\n",
        "  def __init__(\n",
        "      self, vocab_size, embedding_dim, reg, unobserved_weight=0, stddev=0.01,\n",
        "      gramian=None, item_counts=None):\n",
        "    super().__init__()\n",
        "    self.reg = reg\n",
        "    if unobserved_weight:\n",
        "      if gramian is None or item_counts is None:\n",
        "        raise ValueError(\n",
        "            \"gramian and item_counts are required when unobserved_weight \u003e 0\")\n",
        "    self.unobserved_weight = unobserved_weight\n",
        "    self.gramian = gramian\n",
        "    self.item_counts = item_counts\n",
        "    self.embeddings = tf.keras.layers.Embedding(\n",
        "        vocab_size, embedding_dim,\n",
        "        embeddings_initializer=tf.keras.initializers.random_normal(\n",
        "            stddev=stddev),\n",
        "        activity_regularizer=None)\n",
        "\n",
        "  def call(self, features):\n",
        "    return self.embeddings(features[\"sid\"])\n",
        "\n",
        "  # @tf.function\n",
        "  def loss_vector(self, predictions, labels, weights, features):\n",
        "    \"\"\"Implements quadratic loss with frequency regularization.\n",
        "    \n",
        "    Args:\n",
        "      predictions: a [batch_size] vector of predictions.\n",
        "      labels: a [batch_size] vector of labels.\n",
        "      weights: a [batch_size] vector of weights. Useful for the adaptive_weights\n",
        "        method.\n",
        "      features: a dict of features, used to get the item ids.\n",
        "    \"\"\"\n",
        "    col_emb = self.trainable_variables[0]\n",
        "    col_norms = tf.reduce_sum(tf.square(col_emb), axis=1)/2\n",
        "    loss_vector = (\n",
        "        tf.pow(labels - predictions, 2)/2*weights\n",
        "        + self.reg * tf.gather(col_norms, features[\"sid\"])\n",
        "        )\n",
        "    if self.unobserved_weight:\n",
        "      emb = self.embeddings(features[\"sid\"])\n",
        "      counts = tf.cast(tf.gather(self.item_counts, features[\"sid\"]), tf.float32)\n",
        "      # gravity = \\sum_{i \\in batch} v_i^T G v_i/2 / c_i\n",
        "      # where v_i is the embedding, G is the Gramian, and c_i is the (noisy)\n",
        "      # count for item i.\n",
        "      gravity = tf.reduce_sum(tf.matmul(emb, self.gramian)*emb, axis=1)/counts\n",
        "      loss_vector += self.unobserved_weight * gravity\n",
        "    return loss_vector"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0WMA1ozQT5ai"
      },
      "source": [
        "### Non-private"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 459
        },
        "executionInfo": {
          "elapsed": 1021479,
          "status": "ok",
          "timestamp": 1681244495945,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "I8IEXBhpTStM",
        "outputId": "bbd79c75-008c-4d7b-f272-dbecd97858b3"
      },
      "outputs": [
        {
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEvCAYAAABL4wrUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90\nbGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAAsT\nAAALEwEAmpwYAAA2CElEQVR4nO3deXxU9b3/8ddnluwLSYAACZAIyL5HBK02uAEWsbXeCi73FrVc\nW1xvtcpti7XW/rj12qtVW2ttr7W1UKW2VYssVSJ6XRCUHZEdQlhCwpI9meT7++OcTCaTbRKSTGbm\n83w85jFztpnPRHmfM2e+8zlijEEppVT4cgS7AKWUUl1Lg14ppcKcBr1SSoU5DXqllApzGvRKKRXm\nNOiVUirMuYJdQHN69+5tsrKygl1GI2VlZcTHxwe7jIBorV0nlOoNpVohtOrtibVu3LjxpDGmT3PL\nemTQZ2VlsWHDhmCX0UheXh65ubnBLiMgWmvXCaV6Q6lWCK16e2KtInKwpWV66kYppcKcBr1SSoU5\nDXqllApzPfIcvVIqdNTU1JCfn09lZeU5PU9ycjI7d+7spKq6VjBrjYmJITMzE7fbHfA2GvRKqXOS\nn59PYmIiWVlZiEiHn6ekpITExMROrKzrBKtWYwxFRUXk5+eTnZ0d8HZ66kYpdU4qKytJS0s7p5BX\ngRER0tLS2v3pSYNeKXXONOS7T0f+1hr0SikV5jTolVIRJyEhAYCCggKuv/76ZtfJzc1t9YebWVlZ\njB07lnHjxvHlL3+Zgwcbfq8kItxyyy3eaY/HQ58+fZg9ezYAx48fZ/bs2YwfP55Ro0Zx9dVXA3Dg\nwAFiY2OZMGGC9/bSSy+d8/sNmy9ja+sMf/vsCNl94pk0KCXY5SilQsCAAQNYvnx5h7dfu3YtvXv3\n5uGHH+YnP/kJv/nNbwCIj49n27ZtVFRUEBsby5o1a8jIyPBut3jxYq688kruueceALZs2eJdNmTI\nEDZt2tThmpoTNkf0DoHFf9/G65sKgl2KUqqbPfjgg/zyl7/0Tv/oRz/ikUce4fLLL2fSpEmMHTuW\nv//97022O3DgAGPGjAGgoqKCuXPnMm7cOG644QYqKioCfv1p06Zx5MiRRvNmzZrFP/7xDwCWLl3K\nvHnzvMuOHj1KZmamd3rcuHEBv1ZHhM0RvYgwKC2ew8XlwS5FqYj1yBvb2VFwtkPb1tbW4nQ6m8wf\nNSCJh68Z3eq2c+fO5d577+U73/kOAK+88gorV67kvvvuIykpiZMnTzJ16lTmzJnT4peZv/rVr4iL\ni2PLli1s2bKFSZMmBVz7ypUr+epXv9qkph//+MfMnj2bLVu2cOutt/Lee+8BsHDhQm644QaeeeYZ\nrrjiCubPn8+AAQMA2Lt3LxMmTPA+z9NPP80ll1wScC3NCZugBxiUGsvewrJgl6GU6mYTJ07kxIkT\nFBQUUFhYSEpKCv379+e+++5j3bp1OBwOjhw5wvHjx+nXr1+zz7Fu3TruvvtuwDrCDuQoe/r06Rw/\nfpy+ffvyk5/8pNGycePGceDAAZYuXeo9B19vxowZ7Nu3j5UrV/LWW28xceJEtm3bBnTNqZswC/o4\n8nYVUldncDh0uJdS3a2tI+/WnOuPkK6//nqWL1/OsWPHmDt3Li+//DKFhYVs3LgRt9tNVlZWm+PP\n2zt0ce3atcTHx/PNb36TxYsX8/Of/7zR8jlz5nD//feTl5dHUVFRo2WpqanceOON3HjjjcyePZt1\n69YxefLkdr1+oMLmHD1YQV/lqaOwtCrYpSilutncuXNZtmwZy5cv5/rrr+fMmTP07dsXt9vN2rVr\nG42Kac6ll17Kyy+/DMC2bdsafUHamtjYWJ588kleeukliouLGy279dZbWbx4MWPHjm00/5133qG8\n3DrNXFJSwt69exk0aFCgb7XdwiroB6bGAXBIz9MrFXFGjx5NSUkJGRkZ9O/fn5tuuokNGzaQk5PD\nyy+/zIgRI1rd/tvf/jalpaWMGzeOn/3sZ0yZMiXg1+7fvz/z5s3j2WefbTQ/MzPTO7LG18aNG8nJ\nyWHcuHFMmzaN22+/nQsuuABoOEdff/vFL34RcB0tCbtTNwCHisq5ICs1yNUopbrb1q1bvY979+7N\nhx9+2Ox6paWlgDUWvv7ceGxsLMuWLQv4tQ4cONBo+umnn27y/L5yc3O9Fyt54IEHeOCBB5qsk5WV\n1a7RPoEKqyP6jJRYRPSIXimlfIXVEX20y8mA5FgNeqVUp7nwwgupqmr8vd9zzz3H1KlTg1RR+4VP\n0NfVwcH3mZp4ggPFMcGuRikVJj7++OMm80pKSoJQSccFdOpGRGaKyC4R2SMiDzWzPEVE/ioiW0Rk\nvYiMCXTbTiMCL3+Da+ve1iN6pZTy0WbQi4gTeBaYBYwC5onIKL/V/hPYZIwZB/wr8FQ7tu0cIpCS\nRSbHKSypoqK6tkteRimlQk0gR/RTgD3GmH3GmGpgGXCt3zqjgLcBjDGfA1kikh7gtp0nJYu0mqMA\nHD6lR/VKKQWBBX0GcNhnOt+e52szcB2AiEwBBgOZAW7beVKySCjPBwyHijTolVIKAvsytrnfBBu/\n6SXAUyKyCdgKfAZ4AtzWehGRBcACgPT0dPLy8gIorbGMohqGecpJ4yzvrN+C60TgF89tS2lpaYdq\nCgatteuEUr3dVWtycnKnfDlZW1vboec5ffo0r776Kt/61rfave2zzz7L/PnziYuLa3GdMWPGkJCQ\ngIjQq1cvfv3rX5ORkUFJSQlJSUnccMMN3vbEHo+HYcOGkZOTw6uvvsqJEydYuHAhR44coaamhkGD\nBvGXv/yFgwcPcsEFFzBs2DDv6yxcuJAbb7wxoLorKyvb99/WGNPqDZgGrPKZXgQsamV9AQ4ASe3d\ntv42efJk0yGfv2XMw0lm3uJfmIf/vq1jz9GCtWvXdurzdSWtteuEUr3dVeuOHTs65XnOnj3boe32\n799vRo8e3aFtBw8ebAoLCwNeZ/Hixeb222/31hofH28mTJhgysvLjTHGrFixwowfP9585StfMcYY\ns2DBAvPkk096n2vz5s3nXLMxzf/NgQ2mhUwN5Ij+E2CYiGQDR4C5QKPdjoj0AsqNdR7+dmCdMeas\niLS5badKta6KPiH+FJ/ryBulut9bD8GxrW2v14zYWg84m4mkfmNh1pIWt3vooYe8bQOuvPJK+vbt\nyyuvvEJVVRVf+9rXeOSRRygrK+Mb3/gG+fn51NbW8sMf/pDjx49TUFDA9OnT6d27N2vXrm2zxmnT\npjVpSVDfd/7666/39p2vb0d89OhRrrrqKu+6Xd13viVtnqM3xniAO4FVwE7gFWPMdhG5Q0TusFcb\nCWwXkc+xRtjc09q2nf82bL2spkDDo4t0iKVSEWLJkiXe1r5XXnklu3fvZv369WzatImNGzeybt06\nVq5cyYABA9i8eTPbtm1j5syZ3H333QwYMIC1a9cGFPLQct/5ZcuWUVlZyZYtW7jwwgu9yxYuXMht\nt93G9OnTeeyxxygoaLgwkn9Pm/qdQ1cI6AdTxpgVwAq/ec/5PP4QGOa/XUvbdhl3LCT2J8tZyOHC\ncm1XrFR3a+XIuy0V59imGGD16tWsXr2aiRMnAtb3FLt37+aSSy7h/vvv58EHH2T27NntvpCHf995\n60yJpSf1nW9JWPW6ASAli361x7RdsVIRyBjDokWL2LRpE5s2bWLPnj3cdtttnH/++WzcuJGxY8ey\naNEifvzjH7freevbHI8ePZrFixc3WV7fd973coH16vvO/+EPf+CCCy5g3bp1HX5/HRWWQZ9cZV27\nUU/fKBX+EhMTvaN1ZsyYwe9+9ztv98gjR454rzwVFxfHzTffzP3338+nn37aZNu2hELf+ZaEZdBH\nlx8nmmodS69UBEhLS+Piiy9mzJgxrFmzhhtvvJFp06YxduxYrr/+ekpKSti6dStTpkxhwoQJPPbY\nY/zgBz8AYMGCBcyaNYvp06cH9Fr1fefrh1PW6yl951sSPk3N6qVkIxgyHYUc1CN6pSLCn/70p0bT\n/qE7ZMgQZsyY0WS7u+66i7vuuqvV526u73z9p4Ce1ne+JWF5RA8wMf4MhzXolVIqHI/oswAYHVfM\nmxr0SqkANdd3/g9/+EOT8+6hKPyCPqEvuGIZ4jqpX8YqpQLWXN/5cBF+p260XbFS3c53XLnqWh35\nW4df0IO2K1aqG8XExFBUVKRh3w2MMRQVFRET076r6IXfqRuA1GwS9r0LGA4WlXN++rn92k4p1bLM\nzEzy8/MpLCw8p+eprKxsd4AFSzBrjYmJITMzs13bhGfQp2Th9JTTm7N6nl6pLuZ2u8nOzj7n58nL\ny/O2LujpQqlWCONTN2A1N9MhlkqpSBfWQT8+/pQe0SulIl54Br22K1ZKKa/wDHp3LCQOsNoVF1vt\nipVSKlKFZ9CD3a74qLYrVkpFvLAO+l6VVrvig9rFUikVwcI66KMr7HbFep5eKRXBwjroATIdhRr0\nSqmIFvZBr+2KlVKRLnyDPtX6pd7ouGI9oldKRbTwDfr4PuCOY6hLT90opSJb+Aa9t13xCW1XrJSK\naOEb9GC3Ky4A0KN6pVTECvugjy/PB4wGvVIqYoV90Ds9FdquWCkV0cI86K2RNyOiT+oQS6VUxArz\noM8CYFz8aT2iV0pFrPAOertd8QhtV6yUimDhHfTuGLtd8QkOabtipVSECu+gB0jJIr32GNWeOk6U\naLtipVTkCSjoRWSmiOwSkT0i8lAzy5NF5A0R2Swi20Vkvs+y++x520RkqYh076XTfdoV6+kbpVQk\najPoRcQJPAvMAkYB80RklN9qC4EdxpjxQC7whIhEiUgGcDeQY4wZAziBuZ1Yf9tSs7VdsVIqogVy\nRD8F2GOM2WeMqQaWAdf6rWOARBERIAEoBjz2MhcQKyIuIA4o6JTKA2WPvBmo7YqVUhEqkKDPAA77\nTOfb83w9A4zECvGtwD3GmDpjzBHgv4FDwFHgjDFm9TlX3R520E+IP61j6ZVSEckVwDrSzDz/4Ssz\ngE3AZcAQYI2IvId1quZaIBs4DbwqIjcbY/7Y5EVEFgALANLT08nLywvsHbTBXX2ai4EhHOEv+4+S\nl3e6Q89TWlraaTV1Na2164RSvaFUK4RWvaFUKwQW9PnAQJ/pTJqefpkPLDHGGGCPiOwHRgCDgf3G\nmEIAEXkNuAhoEvTGmOeB5wFycnJMbm5u+95JS4yBT+IZk1TGb8+46ejz5uXldXjb7qa1dp1QqjeU\naoXQqjeUaoXATt18AgwTkWwRicL6MvV1v3UOAZcDiEg6MBzYZ8+fKiJx9vn7y4GdnVV8QHzaFZ8s\nraK82tP2NkopFUbaDHpjjAe4E1iFFdKvGGO2i8gdInKHvdqjwEUishV4G3jQGHPSGPMxsBz4FOvc\nvQP7qL1bpWSRVm0NsTxcXNHtL6+UUsEUyKkbjDErgBV+857zeVwAXNXCtg8DD59DjecuJYuEPW9T\n3654eL/EoJajlFLdKfx/GQuQkoWjtpI+nNEhlkqpiBMxQQ8wPLpIh1gqpSJORAX9eG1XrJSKQJER\n9L0GAcLw6CIOFpUFuxqllOpWkRH07hhIGkCW4wSHT1Vou2KlVESJjKAHq11x3VFtV6yUijgRFfS9\nKq0f9Op5eqVUJImooNd2xUqpSBRRQQ8wSNsVK6UiTAQFfTZgD7HUkTdKqQgSQUGfBcCY2GI9oldK\nRZTICfr43uCOZ6j7JIe0sZlSKoJETtDb7YozOK7tipVSESVygh7sdsXWEEttV6yUihSRFfSp2SSU\n51PfrlgppSJBZAW9t12xNjdTSkWOiAt6gBHRRTrEUikVMSIy6LVdsVIqkkRW0CcPpL5dsQa9UipS\nRFbQ2+2KBzsKtV2xUipiRFbQA6Rka7tipVREicCgz6JX5RFA2xUrpSJDRAZ9dMUJYqjSoFdKRYSI\nDHqw2xXrEEulVASI2KDXIZZKqUgRsUE/OvaUBr1SKiJEXtDH94aoBG1XrJSKGJEX9PXtis0xbVes\nlIoIkRf0AClZ9K7RdsVKqcgQsUEfb7crPqgjb5RSYS5ig95RW6XtipVSESGgoBeRmSKyS0T2iMhD\nzSxPFpE3RGSziGwXkfk+y3qJyHIR+VxEdorItM58Ax3i0674sAa9UirMtRn0IuIEngVmAaOAeSIy\nym+1hcAOY8x4IBd4QkSi7GVPASuNMSOA8cDOTqq941KyAR1Lr5SKDIEc0U8B9hhj9hljqoFlwLV+\n6xggUUQESACKAY+IJAGXAr8FMMZUG2NOd1bxHdbLalc8IvqkBr1SKuy5AlgnAzjsM50PXOi3zjPA\n60ABkAjcYIypE5HzgELgf0VkPLARuMcY0+QbUBFZACwASE9PJy8vr51vpX2mRqfRu/IAB8+U8c7a\ntThEWl2/tLS0y2vqLFpr1wmlekOpVgitekOpVggs6JtLQP9G7jOATcBlwBBgjYi8Zz//JOAuY8zH\nIvIU8BDwwyZPaMzzwPMAOTk5Jjc3N8C30EH7R3DemRI8dTBq0jT6Jce0unpeXh5dXlMn0Vq7TijV\nG0q1QmjVG0q1QmCnbvKBgT7TmVhH7r7mA68Zyx5gPzDC3jbfGPOxvd5yrOAPvpQskqusdsU6xFIp\nFc4CCfpPgGEikm1/wToX6zSNr0PA5QAikg4MB/YZY44Bh0VkuL3e5cCOTqn8XKVqu2KlVGRo89SN\nMcYjIncCqwAn8DtjzHYRucNe/hzwKPCiiGzFOtXzoDHmpP0UdwEv2zuJfVhH/8Fnj7wZ5CjUIZZK\nqbAWyDl6jDErgBV+857zeVwAXNXCtpuAnI6X2EXssfQTdIilUirMReYvY8GnXXGxBr1SKqxFbtDH\npWm7YqVURIjcoLfbFQ8wx7VdsVIqrEVu0EOjdsV6+kYpFa4iPujr2xUfKtKgV0qFp4gPekdtFX21\nXbFSKoxFeNBbY+m1XbFSKpxFeNBnATA+4ZQe0SulwlZkB73drnh4VJEGvVIqbEV20LuiITmTwY5C\nDp+qoK7OvymnUkqFvsgOeoCULNJrj1LtqeN4SWWwq1FKqU6nQZ8ymORKq12xDrFUSoUjDfqULKIr\nC7VdsVIqbGnQ20MsB2u7YqVUmNKgr29XnKA/mlJKhScNevuIXtsVK6XClQZ9XCpEJTLEVahBr5QK\nSxr0drviDHOck6XVlFVpu2KlVHjRoAdIGUxazVEADp/So3qlVHjRoAdvu2KhTsfSK6XCjgY9QGo2\njtoq+nBGz9MrpcKOBj14h1iOiNF2xUqp8KNBD94hlhPitV2xUir8aNADJDe0Kz6oQa+UCjMa9ACu\nKLtd8Qnyi7VdsVIqvGjQ10vJom/tMaprtV2xUiq8aNDXS8nSdsVKqbCkQV9P2xUrpcKUBn09e4hl\nluOEDrFUSoUVDfp69hDL8QmndeSNUiqsBBT0IjJTRHaJyB4ReaiZ5cki8oaIbBaR7SIy32+5U0Q+\nE5E3O6vwTmcf0Wu7YqVUuGkz6EXECTwLzAJGAfNEZJTfaguBHcaY8UAu8ISIRPksvwfY2SkVdxVv\nu+KTeupGKRVWAjminwLsMcbsM8ZUA8uAa/3WMUCiiAiQABQDHgARyQS+ArzQaVV3BRFI1XbFSqnw\nE0jQZwCHfabz7Xm+ngFGAgXAVuAeY0ydvexJ4HtAHT1dSpa2K1ZKhR1XAOtIM/P8fzo6A9gEXAYM\nAdaIyHvApcAJY8xGEclt9UVEFgALANLT08nLywugtM51XqmTAaWHEOpY8e56jqU3/HlKS0uDUlNH\naK1dJ5TqDaVaIbTqDaVaIbCgzwcG+kxnYh25+5oPLDHGGGCPiOwHRgAXA3NE5GogBkgSkT8aY272\nfxFjzPPA8wA5OTkmNze3ve/l3MXvgcN/oy+nSRowmtxLzvMuysvLIyg1dYDW2nVCqd5QqhVCq95Q\nqhUCO3XzCTBMRLLtL1jnAq/7rXMIuBxARNKB4cA+Y8wiY0ymMSbL3u6d5kK+x/BpV6wjb5RS4aLN\nI3pjjEdE7gRWAU7gd8aY7SJyh738OeBR4EUR2Yp1qudBY8zJLqy7a9SPpY8/zRYNeqVUmAjk1A3G\nmBXACr95z/k8LgCuauM58oC8dlfYnZIHgjgYHlXEmxr0Sqkwob+M9eWKgqRMBjuOa7tipVTY0KD3\nlzKYdG1XrJQKIxr0/rRdsVIqzGjQ+0vJIqryJLFU6sgbpVRY0KD3l2qNvBnsKNSgV0qFBQ16f/ZY\n+vEJpzXolVJhQYPenz2Wfoy2K1ZKhQkNen+xKRCdxBBXobYrVkqFBQ16fyKQMljbFSulwoYGfXNS\nskjVdsVKqTChQd+clGziy48g1HFQx9IrpUKcBn1zUrJw1FbRl9N6nl4pFfI06JtjD7EcGXNSR94o\npUKeBn1z6sfSx+tYeqVU6NOgb059u+JovQCJUir0adA3x25XPEhOaLtipVTI06BvSWqWtitWSoUF\nDfqW+LQr1iGWSqlQpkHfErtdcZy2K1ZKhTgN+pbYI28GO07oWHqlVEjToG+JtitWSoUJDfqW2O2K\nR8ee0qBXSoU0DfqWxKZAdLK2K1ZKhTwN+pb4tSuu9OhYeqVUaNKgb01KFmnVBQAUVmjQK6VCkwZ9\na1KyvO2KPyjQC5AopUKTBn1rUrKQumq+NT6WVQdq2F5wJtgVKaVUu2nQtybVGnlz9yQ3CW5h0Wtb\nqdW+N0qpEKNB3xp7LH1CeT43jYxiS/4ZXvzgQFBLUkqp9tKgb43drphT+5nSz8n04X14YvUu8vU6\nskqpEKJB3xqnG5Iz4dQBRIRHvzoGgB/+bRvG6CkcpVRoCCjoRWSmiOwSkT0i8lAzy5NF5A0R2Swi\n20Vkvj1/oIisFZGd9vx7OvsNdLmULDh1AIDMlDi+e9Vw1u4q5M0tR4NallJKBarNoBcRJ/AsMAsY\nBcwTkVF+qy0EdhhjxgO5wBMiEgV4gO8aY0YCU4GFzWzbs/kEPcA3L8piXGYyj7yxnTPlNUErSyml\nAhXIEf0UYI8xZp8xphpYBlzrt44BEkVEgASgGPAYY44aYz4FMMaUADuBjE6rvjukZENZIU5PBQBO\nh/D/rhvLqfIafrpiZ5CLU0qptgUS9BnAYZ/pfJqG9TPASKAA2ArcY4yp811BRLKAicDHHS02KOyR\nNzGVx72zRg9I5vZLsvnzhsN8uLcoSIUppVRgXAGsI83M8/8mcgawCbgMGAKsEZH3jDFnAUQkAfgL\ncG/9vCYvIrIAWACQnp5OXl5eIPV3ubiyMqYAqYdXk5eX5Z0/KcrQJ1a47+WP+fHFsUQ5m/szBUdp\naWmP+fu1JZRqhdCqN5RqhdCqN5RqBcAY0+oNmAas8pleBCzyW+cfwCU+0+8AU+zHbmAV8B9tvVb9\nbfLkyaZH+dtCU/dwL2OOfNZo9rovTpjBD75p/nvV58GpqwVr164NdgkBC6VajQmtekOpVmNCq96e\nWCuwwbSQqYGcuvkEGCYi2fYXrHOB1/3WOQRcDiAi6cBwYJ99zv63wE5jzM87vDcKtqsepToqGV6/\nE2obvoC9ZFgfrpuYwa/y9rLrWEkQC1RKqZa1GfTGGA9wJ9ZR+U7gFWPMdhG5Q0TusFd7FLhIRLYC\nbwMPGmNOAhcDtwCXicgm+3Z1l7yTrhSbwu5h/w7HtsKHzzRa9P2vjCQxxsWi17ZQp+0RlFI9UCDn\n6DHGrABW+M17zudxAXBVM9u9T/Pn+EPOyT7TYOQ1kLcERs6BtCEApCVE88PZo/iPVzbz8scHuWVa\nVnALVUopP/rL2PaY9Tg4o+H1u6GuYVDR1yZm8KWhvfmvlbs4dqYyiAUqpVRTGvTtkdQfrnoUDr4P\nn73knS0iPPa1MXjq6lj8921BLFAppZrSoG+vSf8KWZfA6sVwtqENwuC0eO694nxW7zjOym3Hglig\nUko1pkHfXiJwzVNQWwUr7gef5ma3fSmbkf2TePj1bZyt1PYISqmeQYO+I9KGQO4i+PxN2PF372y3\n08GS68ZSWFLFz1Z+HsQClVKqgQZ9R027E/qPhxUPQMUp7+zxA3vxzYuy+eNHh9hwoDiIBSqllEWD\nvqOcLpjzNJQXweofNFr03avOJ6NXLIte20q1p66FJ1BKqe6hQX8u+o+Hi+6Cz/4I+/K8s+OjXTz6\n1dHsPlHKc+/uDV59SimFBv25y30IUofAG/dAdcMlBi8bkc7scf155p097C0sDWKBSqlIp0F/rtyx\nMOcX1sVJ8n7aaNHia0YR43aw6LWt2h5BKRU0GvSdIetLMPmb8OGzcORT7+y+iTH859UjWb+/mFc2\nHG55e6WU6kIa9J3likcgvi+8flejDpc3XDCQC7NT+emKnZwo0fYISqnup0HfWWJ7wVeegOPb4P+e\n8s4WEX563Vgqa+r48Rs7glefUipiadB3ppGzYdS18O7P4ORu7+whfRK487KhvLnlKO98fryVJ1BK\nqc6nQd/ZZj0O7pgmHS7v+PIQhvVN4Ad/3UZZlSeIBSqlIo0GfWdLTIerHoNDH8DG//XOjnI5WPL1\nsRScqeSJ1V8EsUClVKTRoO8KE2+G7C/DmofhbIF39uTBqdw8dRAvfrCfzYdPB68+pVRE0aDvCvUd\nLus88I/vNupw+b2ZI+iTGM1Dr22lplbbIyilup4GfVdJzYbLvg+7VsD2v3pnJ8W4eWTOGHYePctv\n398fxAKVUpFCg74rXfht6D8B3voelDd0spw5ph8zRqfzxOpd/GbdPv3VrFKqS2nQdyWnC659xmpj\n7Nfh8mdfH0/u8L48tmInt/zuY73WrFKqy2jQd7V+Y+Hie2DTy7D3He/s5Dg3z98ymf933Vg+PXia\nmU+tY+W2o608kVJKdYwGfXe49HuQNtTucFnmnS0izJsyiDfv/hIDU+K444+f8uDyLTrOXinVqTTo\nu4M7Bq75BZw+BO881mTxkD4J/OXbF/Gd3CG8svEws59+X4dfKqU6jQZ9d8m6GHJuhY9/BfkbmyyO\n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\n07QAAAAASUVORK5CYII=\n",
            "text/plain": [
              "\u003cFigure size 600x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "step 15:\n",
            "|-----------------|--------|\n",
            "| valid_RMSE      | 0.7869 |\n",
            "| valid_RMSE_user | 0.7869 |\n",
            "| test_RMSE       | 0.7827 |\n",
            "| test_RMSE_user  | 0.7827 |\n",
            "\n",
            "Training took 58.59s per sweep, 7.51s per eval\n"
          ]
        }
      ],
      "source": [
        "dim = 64\n",
        "am_10m = AMModel(\n",
        "    ml10m, binarize=False, embedding_dim=dim, init_stddev=0.1,\n",
        "    regularization_weight=15, unobserved_weight=0.0,\n",
        "    row_reg_exponent=1)\n",
        "am_10m.compile_item_tower(\n",
        "    item_encoder=Encoder(ml10m.num_items, dim, reg=0.04, stddev=0.1),\n",
        "    item_batch_size=100_000,\n",
        "    optimizer=tf.keras.optimizers.SGD(learning_rate=0.0001))\n",
        "am_10m.train(\n",
        "    num_steps=15, inner_steps=4096, num_eval_points=15,\n",
        "    plot_metrics=RMSE_METRICS, compute_metrics=True)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-LLLXeeAT7f3"
      },
      "source": [
        "### Private, with adaptive weights."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "ikoSLSvDW3Xt"
      },
      "outputs": [],
      "source": [
        "from tensorflow_privacy.privacy.optimizers import dp_optimizer_keras_sparse as dps\n",
        "\n",
        "def train_10m_am(\n",
        "    steps, inner_steps, learning_rate, clip_norm, count_stddev, epsilon,\n",
        "    method=\"adaptive_weights\", weight_exp=0, dim=32, acc_steps=139,\n",
        "    num_users_per_batch=500, reg=0.5, item_frac=1.0, budget=100):\n",
        "  \"\"\"Trains a RMSE model on ML10M data.\"\"\"\n",
        "  # The logical batch is 139*500 = 69.5K, i.e. full batch (there are 69878 users)\n",
        "  delta = 1e-5\n",
        "  ds = ml10m\n",
        "  num_examples_per_user = budget\n",
        "  sanitizer = Sanitizer(\n",
        "      center=True, budget=budget, method=method, weight_exponent=weight_exp,\n",
        "      item_frac=item_frac, count_stddev=count_stddev, count_sample=budget)\n",
        "  accountant = DPAMAccountant(\n",
        "      sanitizer,\n",
        "      steps=steps*inner_steps,\n",
        "      num_users_per_batch=num_users_per_batch,\n",
        "      gradient_accumulation_steps=acc_steps,\n",
        "      num_users=ds.num_users)\n",
        "  accountant.set_noise_multiplier(target_epsilon=epsilon, target_delta=delta)\n",
        "  optimizer = dps.DPSparseKerasSGDOptimizer(\n",
        "      l2_norm_clip=clip_norm,\n",
        "      noise_multiplier=accountant.noise_multiplier,\n",
        "      num_microbatches=num_users_per_batch,\n",
        "      gradient_accumulation_steps=acc_steps,\n",
        "      learning_rate=learning_rate*num_users_per_batch)\n",
        "  model = AMModel(\n",
        "      ds, binarize=False, embedding_dim=dim, init_stddev=0.1,\n",
        "      regularization_weight=reg, unobserved_weight=0,\n",
        "      sanitizer=sanitizer)\n",
        "  model.compile_item_tower(\n",
        "      item_encoder=Encoder(ds.num_items, dim, reg=reg),\n",
        "      num_users_per_batch=num_users_per_batch,\n",
        "      num_examples_per_user=num_examples_per_user,\n",
        "      optimizer=optimizer) \n",
        "  model.train(\n",
        "      num_steps=steps, inner_steps=inner_steps*acc_steps, num_eval_points=steps,\n",
        "      compute_metrics=True, plot_metrics=RMSE_METRICS)\n",
        "  return model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "height": 459
        },
        "executionInfo": {
          "elapsed": 379133,
          "status": "ok",
          "timestamp": 1681260858412,
          "user": {
            "displayName": "",
            "userId": ""
          },
          "user_tz": 420
        },
        "id": "odbmbJyKYcQ5",
        "outputId": "ce457cdb-d93b-4b23-eb12-d149688542f5"
      },
      "outputs": [
        {
          "data": {
            "image/png": "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\nSikH9/8GWXVAQmNPlQAAAABJRU5ErkJggg==\n",
            "text/plain": [
              "\u003cFigure size 600x500 with 1 Axes\u003e"
            ]
          },
          "metadata": {},
          "output_type": "display_data"
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "step 10:\n",
            "|-----------------|--------|\n",
            "| valid_RMSE      | 0.9014 |\n",
            "| valid_RMSE_user | 0.9014 |\n",
            "| test_RMSE       | 0.8991 |\n",
            "| test_RMSE_user  | 0.8991 |\n",
            "\n",
            "Training took 27.23s per sweep, 5.04s per eval\n"
          ]
        }
      ],
      "source": [
        "am_10m_eps1 = train_10m_am(\n",
        "    steps=10, inner_steps=4, learning_rate=0.5, clip_norm=0.1,\n",
        "    method=\"adaptive_weights\", weight_exp=-1/4, count_stddev=200, epsilon=1)"
      ]
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "last_runtime": {
        "build_target": "//learning/deepmind/public/tools/ml_python:ml_notebook",
        "kind": "private"
      },
      "name": "DPAM.ipynb",
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
